0

このプログラムを実行するまで、配列とポインターは基本的に同じものだと思っていました。

int main() {
  int* a = new int(19);
  int b[1];
  b[0] = 19;

  printf("*a: %d\n a: %p\n &a:%p\n", *a, a, &a);
  printf("*b: %d\n b: %p\n &b:%p\n", *b, b, &b);
  delete a;
}

出力は次のとおりです。

*a: 19
 a: 0x7f94524000e0
 &a:0x7fff51b71ab8
*b: 19
 b: 0x7fff51b71ab4
 &b:0x7fff51b71ab4

&b の出力が b と同じである理由を誰か説明してもらえますか?

ありがとう!-エルベン

4

3 に答える 3

6

まあ、b配列です。わずかな言い訳で、 の最初の要素へのポインタに崩壊しますb。ただし、式bとは等価で&bないbことに注意してください。は最初の要素をポインタに分解します。つまり、は配列へのポインタです。つまり、 型int*です。&bint(*)[1]

于 2013-11-02T19:58:14.367 に答える
2

配列とポインターは同じではありません。ポインターは配列のように振る舞うことができます(例えば、インデックスによるアクセス)。

&b配列全体へのbポインタであり、最初の要素へのポインタです。それらはメモリ内の同じアドレスを指す場合がありますが、まったく異なるものです。

        +-------------------------------+  
        |+-----+-----+-----+-----+-----+|  
        ||     |     |     |     |     ||  
 &b---->||  0  |  1  |  2  | ... |  N  ||  
        ||     |     |     |     |     ||  
        |+-----+-----+-----+-----+-----+|  
        +---^---------------------------+  
            |                              
            b                              
于 2013-11-02T20:06:29.933 に答える
-1

a変数です。newこのポインターを使用してメモリを割り当て、結果を割り当てています。aプログラムの後半で何か他のものを保存することにするかもしれません。

b異なります。異なるアドレスを格納できないという意味では変数ではありません。これは配列であり、開始位置が固定されています。

したがって、b&bは同じです。ただし、 の内容aと実際のアドレスaは異なります。

于 2013-11-02T20:20:44.370 に答える