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;
}

できました。少し迷いそうになりましたが大丈夫でした。

答え合わせ

しまった。配列の要素数をsizeofを使って動的に取得してますね。この間覚えたばかりなのに忘れてました。

次から使うように気をつけましょう。

問題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も同じアドレスを参照しています。