配列とポインタ

念の為に書いておくと、配列とポインタは明確に違うもの。
そのあたりを誤解していると、

void func(int **a);
int a[2][2];
func(a);

コンパイルエラーになることが理解出来ないんじゃないかな。
もちろん、

void func(int *a);
int a[2];
func(a);

はOKなので、そのへんが混乱のもとなんではないだろうか。
あと、

char *s = "abc";

char s[] = "abc";

の違いを説明出来る人も少ないんじゃないかなぁ。実際問題、教える側で理解してない人もいたりするので実務経験のある人にアンケートとってみたいところ。