16

配列の名前が実際には配列の最初の要素へのポインターであるとすると、次のコードは次のようになります。

#include <stdio.h>

int main(void)
{
    int a[3] = {0, 1, 2};
    int *p;

    p = a;

    printf("%d\n", p[1]);

    return 0;
}

期待どおりに印刷1されます。

これで、ポインターを指すポインターを作成できるので、次のように書きました。

#include <stdio.h>                                                              

int main(void)                                                                  
{                                                                               
        int *p0;                                                                
        int **p1;                                                               
        int (*p2)[3];                                                           
        int a[3] = {0, 1, 2};                                                   

        p0 = a;                                                                 
        p1 = &a;                                                                
        p2 = &a;                                                                

        printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",                    
                        p0[1], (*p1)[1], (*p2)[1]);                             

        return 0;                                                               
}

コンパイルして印刷することを期待していました

p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1

しかし、代わりに、コンパイル時に問題が発生し、次のようになります。

test.c: In function ‘main’:
test.c:11:5: warning: assignment from incompatible pointer type [enabled by default]

なぜその割り当ては間違っているのですか?p1が an へのポインタへのポインタintaあり、int(s の配列の名前であるため) へのポインタである場合int、なぜ に代入できないのでしょ&ap1か?

4

3 に答える 3

19

11号線は

        p1 = &a;

どこp1に typeがint **あり、atype がありint[3]ますか?

良い; &aタイプがあり、コンパイラがあなたに言ったように、int(*)[3]そのタイプは互換性がありませんint**

あなたは試してみたいかもしれません

        p1 = &p0;

c-faq、特にセクション 6を読んでください。

つまり、配列はポインターではなく、ポインターは配列ではありません

于 2011-06-24T21:50:30.907 に答える
7

aへのポインタではなく、特定の状況でそのようなintものに減衰します。が初期化にうまく使えない&aタイプだった場合、そうでしたか?int **p2

あなたが望む効果のために行う必要がありp1 = &p0;ます。「ポインターへのポインター」とは、「このアドレスにポインターが見つかる」ことを意味します。しかし、 address を見ると、&a(明らかに) 配列が見つかるためint **、正しい型ではありません。

于 2011-06-24T21:51:23.153 に答える
0

多くの操作で、a暗黙&a的かつ両方とも同じものを返します: 配列内の最初のアイテムのアドレス。

変数にはポインタが格納されていないため、ポインタのアドレスを取得できません。a場合によってはポインターのように動作しますが、ポインターではありません。

于 2011-06-24T21:48:35.667 に答える