3

次の 2 つは C++ で同じですか?

初め:

    int a[10] = {0,1,2,3,4,5,6,7,8,9};

第二に、

    int *a = {0,1,2,3,4,5,6,7,8,9};
4

4 に答える 4

11

1 つ目は整数の配列で、2 つ目は整数へのポインタです。いいえ、それらは同じではありません。

配列はポインターとして使用でき (配列は最初の要素へのポインターに減衰するため)、ポインターは配列として使用できますが、コンパイラーの場合は異なります。

また、配列のサイズはコンパイル時に固定され、10 個の整数のサイズになり、sizeof返されます (最も一般的な4032 ビットの場合)。intポインターのサイズはポインターのサイズであり、ポインターが指すものではありません。そのsizeofため、ポインターで実行すると4、(32 ビット マシンの場合) または8(64 ビット マシンの場合) が返されます。

もう1つ... C++には「リテラル配列」がないため、そのようなポインターに割り当てることはできません。最初にメモリを割り当ててから割り当てる必要があります。ただし、新しい C++11 標準を使用すると、1 つのステップで実行できます。

int* a = new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

上記のようにメモリを割り当てた場合は、解放する必要があることに注意してください。

delete[] a;
于 2013-05-29T07:15:57.270 に答える
5

int *a={0,1,2,3,4,5,6,7,8,9}それは失敗すると思います。

この配列にメモリを割り当ててから、配置を行う必要があります

于 2013-05-29T07:15:40.850 に答える
1

両方の配列を同じ方法で使用すると、同じ結果になります。

printf("%d\n", a[3]);

違いは、コンパイラが 2 つの配列を認識する方法にあります。

  • a[x]バージョンはデータaへの参照を作成します。a isはデータが始まるアドレスです
  • バージョンは、int (またはいくつか)へ*aのポインターを作成します。この場合、intへのポインターを参照します。これは、 と比較して余分な間接化です。aaa[]
  • はポインターであるため、値を変更できますが、値*aを変更することはできませんaa[]

例えば

 int *a;
 a = malloc(sizeof(int) * 10);
 a = &otherint;
 ...

その間

 int a[3] = { 1, 2, 3 };
 a = malloc(sizeof(int)); // <== ERROR

初期化に関しては、a[]値を直接受け取ることしかできません。int割り当て*aが必要です

 int *a = { 1, 2, 3}; // <== ERROR
于 2013-05-29T07:15:55.960 に答える
1
int a1[10]={0,1,2,3,4,5,6,7,8,9};

a1は配列なので、スコープ外に出るとメモリが解放されます

それ以外の場合int *a2={0,1,2,3,4,5,6,7,8,9} a2はポインタです(そして、そのように初期化することはできないと思います)。たとえそうしてもa2 = a1、メモリはまだa1によって「所有」されています。
を使用すると、a1 と a2 が異なる型であることがわかりますsizeof。a2 はポインターのサイズのみですが、a1 はsizeof(int) * 10

于 2013-05-29T07:18:34.613 に答える