いいえ、すべての配列インデックスのポインターを取得することはできません。メモリの連続ブロックである配列を指す単一のポインターを取得します。これが、インデックス自体と配列アドレスから任意のインデックスのアドレスを計算できる理由です。
たとえばa
、メモリ位置によって認識される変数0xffff0012
が に設定されている場合、次の0x76543210
ようにメモリ内に配置できます。
+-------------+ This is on the stack or global.
0xffff0012 | 0x76543210 |
+-------------+
+-------------+ This is on the heap (and may also
0x76543210 | a[ 0] | have some housekeeping information).
+-------------+
0x76543212 | a[ 1] |
+-------------+
0x76543214 | a[ 2] |
+-------------+
0x76543216 | a[ 3] |
+-------------+
: :
+-------------+
0x7672B68E | a[999999] |
+-------------+
n
index のアドレスが であることがわかります0x76543210 + n * 2
。
したがって、実際には 1 つの 8 バイト ポインターと 100 万の 2 バイト ショートがあり、この場合は合計 2,000,008 バイトになります。
これはmalloc
、ポインター自体と同様に、実際の配列と比較してごくわずかなハウスキーピング オーバーヘッドの上にあります。