3

次のコードを検討してください

#include<stdio.h>

int main()
{
    int a[2][3][4] = { {1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 1, 2}, 
                       {2, 1, 4, 7, 6, 7, 8, 9, 0, 0, 0, 0} };
    printf("%u, %u, %u, %u\n", a, *a, **a, ***a);
    return 0;
}

私が間違っていなければa、配列が始まる位置を指しています.だから、なぜa ,*a ,**a3つすべてが同じ位置を与えるのですか?

4

2 に答える 2

0

C のポインター変数には、アドレスと型の 2 つの属性があります。%uの形式コードでポインタを出力するとprintf()、アドレスだけが得られます。(他の人がこのページで指摘しているように、実際にはこれを使用するべきではありません%u。使用可能な場合は使用する必要%pがありますprintf()。)

これは正当な表現です:

a[0][0][0]

aこれは 3 回索引付けされます。aタイプが「整数へのポインター」の場合、インデックスを作成できるのは 1 回だけです。これは実際には 3 倍の間接ポインターです。(int ***a;単に整数へのポインタへのポインタへのポインタとして宣言した場合、固定サイズの配列として宣言したため、C コンパイラは が指す配列のサイズを認識しaます。)

あなたはこれを行うことができます:

int *p = a[0][0];

インデックスaを 2 回作成すると、int 型へのポインターの結果が得られます。

しかし、キャストなしではこれを行うことはできません:

int **p = a[0];

これは、これは固定サイズの配列であり、最も内側の配列サイズは 4 であるため、C コンパイラは、インデックスを使用する場合、正しい整数アドレスを見つけるためにa[0]インデックスを で乗算する必要があることを認識しているためです。キャストと強制を使用する場合変数に、ここでインデックスを付けると、C コンパイラは結果がポインターを指していると想定します。そうではないので、実際には有用な方法で使用することはできません。4*sizeof(int)a[0]ppp

于 2013-09-15T18:29:59.163 に答える
0

はい、これは正しいです

ポインターへのポインターは、他の変数と同様に変数ですが、変数のアドレスを保持します。その変数はたまたまポインターです。

この 2D 配列への参照は型を持つ(a*)* = a**ため、ポインターへのポインターになります。

補足:- Oli Charlesworth がコメントしたように、 %u を使用してポインターを解釈しているため、コードは未定義の動作を呼び出しています。

于 2013-09-15T18:14:03.570 に答える