The diagonalization argument is an intuitive tool, IMHO. It is great if it convinces you, but it's difficult to make rigorous in a way that everyone accepts due to the use of a decimal expansion for every real number. One way to avoid that is to prove a little fact: the union of a finite number of intervals can be written as the finite union of disjoint intervals, and that the total length of those intervals is at most the total length of the original intervals. (Prove it by induction.)
THEOREM: [0, 1] is uncountable. Proof: By way of contradiction, let f be the surjection that shows [0, 1] is countable. Let U_i be the interval of length 1/2*i centered on f(i). The union V_n = U_1 + U_2 + ... + U_n has combined length 1 - 1/2*n < 1, so it can't contain [0, 1]. Another way to state that is that K_n = [0, 1] - V_n is non-empty. K_n also compact, as it's closed (complement of V_n) and bounded (subset of [0, 1]). By Cantor's intersection theorem, there is some x in all K_n, which means it's in [0,1] but none of the U_i; in particular, it can't be f(i) for any i. That contradicts our assumption that f is surjective.
Through the right lens, this is precisely the idea of the diagonalization argument, with our intervals of length 2*-n (centered at points in the sequence) replacing intervals replacing intervals of length 10*-n (not centered at points in the sequence) implicit in the "diagonal" construction.