6

ポインターの理論が特に厄介だとは思いませんが、表記のいくつかに困惑することがあります。次の例で、誰かが線がどのように機能するかを説明できますかp = (int*) a? 私がコードについて持っている説明は、この行が最初の配列の最初の要素のアドレスをポインター p に格納するだけであることを示唆していprintf("%u", *p)ます5。この場合、この行は単純に間接的な書き方p = a[0]ですか?

int main()
{
    int a[][4] = {
        5, 7, 5, 9,
        4, 6, 3, 1,
        2, 9, 0, 6
        };



    int *p; // create an integer pointer
    int (*q)[4]; // create a pointer to a four-element integer array

    p = (int*)a; // ?
    q = a;


    printf("%u %u\n", p, q);
    p++;
    q++;
    printf("%u %u\n", p, q);


    return 0;
}
4

5 に答える 5

9

式 は、値のコンテキストで使用されると、正しく理解されているようaに、実際に「配列の最初の要素のaアドレス」 - アドレス- に評価されます。a[0]

ただし、配列aは実際には2D配列と呼ばれるものであることに注意してください。配列の配列です。array の最初の要素aは、それ自体が配列です: type の配列ですint [4]。したがって、上記を考慮に入れると、値コンテキストで使用される場合、expressionは型のポインタであり、概念的に1D array全体aを指すexpression と同等です。&a[0]int (*)[4]a[0]

このため、しようとする試み

p = a;

コンパイラからの診断メッセージが表示されます。ポインター オブジェクトint (*)[4]に値を代入することはできません。int *これらのタイプは互換性がありません。この診断メッセージを抑制するために、問題のコードは明示的なキャストを使用します

p = (int *) a;

int (*)[4]これにより、前述のポインター値が に強制的に押し込まれpます。典型的な実装では、これは元のポインターの数値を保持し、概念的な型変換のみを実行します。

の値にアクセスしようとすると、数値的に全体のアドレスが のアドレスと同じであり、 のアドレスと同じであるため*p、通常は の値が生成されます。上記のコードは、明示的なキャストを使用して型の非互換性を回避しながら、この数値の同一性を利用しています。a[0][0]aa[0]a[0][0]

于 2013-02-27T22:10:52.803 に答える
7

私がコードについて持っている説明は、この行が最初の配列の最初の要素のアドレスをポインター p に格納するだけであることを示唆しています

正しい。

この場合、この行は単純に間接的な書き方p = a[0]ですか?

いいえ、そうではありません。「この行は最初の要素のアドレスを格納するだけです」-かなり似ています

p = &a[0];

しかし、&a[0]タイプが であるため、上記のステートメントは完全に正しいわけではありませんint (*)[4]。キャストなしの正しい割り当ては次のようになります

p = &a[0][0];

with を使用してさまざまな宣言をコンパイルして遊んで-Wall、時折発生するエラー/警告をググってください :)

于 2013-02-27T21:55:31.307 に答える
2

H2CO3 の回答を拡張するには、ほとんどのコンテキストで、配列型の式がポインター型の式に変換され、式の値が配列の最初の要素のアドレスになることを覚えておいてください。

式の型aは「4要素配列の3要素配列int」です。sizeof_Alignof、または単項演算&子のオペランドである場合を除き、は「( )の 4 要素配列へのポインタ」型の式にa変換れ、その値は のアドレスになります。問題は、 type の値を typeの変数に代入できないことです。型に互換性がないため、式の結果を にキャストする必要があります。intint (*)[4]a[0]int (*)[4]int *aint *

これが機能するのは、配列のアドレスと配列の最初の要素のアドレスが同じであるためです。式a&aa[0]&a[0]、および&a[0][0]はすべて同じ値を生成し、が異なるだけです( int (*)[4]int (*)[4][4]int *int (*)[4]、およびint *、それぞれ)。

于 2013-02-27T22:31:26.233 に答える
0

ほとんど。書くことに似ていp = &a[0][0]ます。

于 2013-02-27T21:55:29.033 に答える
-2

aの配列3の配列4ですint

の値aは、 の配列へのポインタ4ですint。このポインターの値は、配列の先頭のアドレスです。

(int *) aポインタを へのポインタに変換しますint。値は変わりませんが、型が異なります。

ポインター値を出力するための正しい仕様はpです。

于 2013-02-27T21:55:29.940 に答える