次の 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
返されます (最も一般的な40
32 ビットの場合)。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へのポインターを参照します。これは、 と比較して余分な間接化です。a
a
a[]
*a
を変更することはできませんa
a[]
例えば
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