1

私は配列を持っています

int ar[5] = {1,2,3,4,5};
printf("%d",(ar==&ar));

print ステートメントは true を返します。しかし、私がやるar+1とどうなるでしょうか&ar+1。それはどこを指していますか?

また、私が持っている場合

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

cpp+1 はどこを指していますか? cpそれはieの後ですか、それともcp[4]を指していcp[1]ますか?

4

2 に答える 2

2

sizeofor 単項演算子のオペランドである場合、または宣言で配列を初期化するために使用される文字列リテラルである場合を除き、&" の N 要素 " 型の式は " 型の式Tに変換 ("decay") されます。 "へのポインタTであり、その値は配列の最初の要素のアドレスになります。

式のar型は「5 要素配列int」です。演算子のオペランドでない場合は、&「ポインタへのint」型に変換され、その値は配列の最初の要素のアドレスになります。

&ararは、 が単項演算子のオペランドである&ため、変換は行われません。この場合、式の型は「5要素配列へのポインタint」です。

arとの&arは同じですが (配列の最初の要素のアドレスは配列全体のアドレスと同じです)、型が異なります。

Expression     Type         Decays to
----------     ----         ---------
        ar     int [5]      int *
       &ar     int (*)[5]   n/a

ar + 1は次のint値を指します (これは書き込みと同じ&ar[1]です)。 &ar + 1の次の5 要素配列をint指します (つまりint、配列の最後の要素の直後の値を指します)。

cpp + 1次の要素を指しchar **ます (書き込みと同等&cp[1])。

于 2014-08-01T14:22:03.217 に答える