int *n; *n = 5;

はてなブックマークとかで話題になっていたこのコード

int main( void ) {
  int *n;
  *n = 5;
  printf( "%d\n", *n );
  ...
C/C++のポインタの機能--参照渡しのような処理

一見すると普通(?)のコードですが、初期化されていないnを使っているので危険ってやつですね。これだけだと単なる間違いなのですが、説明文も含めてポインタを理解していないのがバレて話題になったということのようです。

何でこういう間違いになってしまったのか、理由と思わしきものがちゃんと書いてあって、

このときnには代入された値を記憶した場所(アドレス)が自動的に代入される

C/C++のポインタの機能--参照渡しのような処理

という勘違いが原因のようです。偶然動いた場合は確かにそのように見えるので、原理を無視すればその通り(?)な気がしますが、残念ながら値を代入する前と後でnの値は変わらないです。

この手のポインタの間違いでいつも思うのですが、

ポインタ変数の宣言では、一般の変数の場合とは異なり、名称の先頭に*がつけられる。

C/C++のポインタの機能--参照渡しのような処理

という説明に問題があるんじゃないかと思います。
コードとして書くとこういうことなんですが、

  int *n;

これだと何か特殊なものを作成してる感じに見えちゃうんだと思います。実際に大学の授業とかの経験でも、int n; は分かっても、int *n; は「魔法の言葉」扱いになっちゃう場合が多いですし。

ポインタより前に float や char のような型の説明をしてるはずなので、

  int* n;

こう書いて int* も型の一種です、という説明の方が素直で分かりやすいと思うのですが、残念ながらそんな感じの入門書に遭遇したことがないです。やっぱり前者の方が主流なので、それに合わせてあるのでしょうか?

あと歴史的経緯を全然知らないのですが、前者の方が主流な理由は何なんでしょう?1行で複数の変数を宣言した場合に紛らわしいから、とかなのかな。