これはrst2hooktailの記事ソース保存・変換用です(詳細).
============================================================ 自分で調べるCのポインタ ============================================================ C言語の開発環境があれば,自分でテストプログラムを作ることにより, 手持ちの教科書・参考書だけでポインタの性質を理解することができます. 以下に調べ方の例を示します.例を変更して自分でいろいろ試みてください. 本文に誤りがあったとき自信を持って訂正できます. 簡単な例 ============================================================ まず次の例を考えましょう.結果が予想できない人は実際にプログラムを 作って実行してください. 例1.次のプログラムの出力は「1, 4」. <tex> & #include <stdio.h>\\ & int main(void)\\ & {\\ & & int n[3]={4, 5, 6}, *p=n;\\ & & printf("%d, %d\n", p==\&n[0], *p);\\ & & return 0;\\ & } </tex> #include <stdio.h> int main(void) { int n[3]={4, 5, 6}, *p=n; printf("%d, %d\n", p==\&n[0], *p); return 0; } 問1.例1の n, p について 1. p[1] の値を示せ. 2. &n[1]-&n[0] の値を示せ. 例1で実在する変数は n[0], n[1], n[2], p のみですが,「p=n;」によって n[i] の代わりに p[i] を使うことができます.一般に <tex> p[i]==*(p+i), \&p[i]==p+i </tex> したがって p==\&p[0], *p==p[0] であり,「p=n+1;」とすると <tex> p[-1]==n[0], p[0]==n[1], p[1]==n[2] </tex> となります.Cで「&p[i]==p+i」と定めたのは「p+=sizeof(int);」の代わりに 「p++;」を使いたいためであると思われます.『アドレス+整数』と 『アドレス−アドレス』は次元(?)が違うので &n[1]-&n[0]==sizeof(int) と 定めることもできますが [*]_ ,&n[1]!=&n[0]+(&n[1]-&n[0]) となるので,Cの 言語仕様はそうなっていません.実際 <tex> & #include <stdio.h>\\ & int main(void)\\ & {\\ & & int n[3], k0=\&n[0], k1=\&n[1];\\ & & printf("%d, %d\n", k1-k0, \&n[1]-\&n[0]);\\ & & return 0;\\ & } </tex> を実行すると,k1-k0==sizeof(int), &n[1]-&n[0]==1,2*(&n[1]-&n[0]==2 と なります.「k0=&n[0];」は警告が出るかもしれませんが,無意味な代入では ないのでエラーにはなりません. .. [*] Cの表現における &n[1]==n+1 && &n[1][2]!=(n+1)+2 等の不自然な式が なくなります.どう定めても複雑な式には歪が伴います. 2次元配列とポインタの配列 ============================================================