物理のかぎしっぽ 自分で調べるCのポインタ のバックアップ差分(No.2)

#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次元配列とポインタの配列
 ============================================================
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji Powered by PHP 5.3.29 HTML convert time to 0.007 sec.