42章 多重間接参照
http://www.geocities.jp/ky_webid/c/042.html
またなにやら難しそうな名称が出てきましたね。
ポインタのポインタですって!
スーパーややこしそうです。
問題1
次のプログラム中の誤りを修正して下さい。
int main(void){ char str[81]; char *pStr = str; char **ppStr = &pStr; puts( "80文字以内の文字列を入力して下さい" ); fgets( **ppStr, 81, stdin ); puts( str ); return 0; }
読み解いていきます。
fgetsの**ppStrの*が一つ多いですね。
答え合わせ
正解です。
問題2
引数で渡された文字列配列の内容を、画面に表示する関数を作って下さい。関数の形式は次のようにします。
void show(char **str, size_t size);
やってみます。
void show(char **str, size_t size) { while(size--){ printf("%s\n",*str++); } } int main () { char *str[] = { "aaaa", "bbbb", "cccc", }; show(str,3); return 0; }
できました。少し迷いそうになりましたが大丈夫でした。
問題3
printf関数の%pフォーマット指定子を使い、ポインタへのポインタや、ポインタが、どのような値を持っているか表示させて確認してみて下さい。
試してみます。
int main () { char str[] = "abc"; char *pStr = str; char **ppStr = &pStr; printf("%p\n",str); printf("%p\n",pStr); printf("%p\n",*pStr); printf("%p\n",ppStr); printf("%p\n",*ppStr); printf("%p\n",**ppStr); }
$ main 0012FF6C 0012FF6C 00000061 0012FF74 0012FF6C 00000061
これを見てみると分かるとおり、strとpStrと*ppStrは同じアドレスを参照しています。
また*pStrと**ppStrも同じアドレスを参照しています。