次の 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};
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;
int *a={0,1,2,3,4,5,6,7,8,9}それは失敗すると思います。
この配列にメモリを割り当ててから、配置を行う必要があります
両方の配列を同じ方法で使用すると、同じ結果になります。
printf("%d\n", a[3]);
違いは、コンパイラが 2 つの配列を認識する方法にあります。
a[x]バージョンはデータaへの参照を作成します。a isはデータが始まるアドレスです*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
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