- 追加された行はこの色です。
- 削除された行はこの色です。
#rst2hooktail_source
============================================================
自分で調べる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次元配列とポインタの配列
============================================================