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

自分で調べるCのポインタ

これはrst2hooktailの記事ソース保存・変換用です(詳細).

コンバート

最近コンバートされた結果: HTMLPDFTeX

公開・更新メニュー ▼▲

記事ソースの内容

============================================================
自分で調べる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>

問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.012 sec.