配列arr[]
を定義し、それへのポインターを定義すると、次のようになります。
int *p=arr;
arr
(アドレスに関して)の値が0x1234
. の値はどうなりますp
か? それは同じでしょうか?
配列arr[]
を定義し、それへのポインターを定義すると、次のようになります。
int *p=arr;
arr
(アドレスに関して)の値が0x1234
. の値はどうなりますp
か? それは同じでしょうか?
はい。値は同じです。これを確認するには、試してみてください
printf("arr=%p p=%p\n", arr, p);
「の値arr
」はアドレスではありません。arr
は配列型の変数であり、その「値」は配列、つまり一連のint
要素です。「値」は、型のコンテキストでのみ意味があります。
配列型の式 (例: arr
) は、ポインター型が必要なコンテキストで、ポインター型の右辺値式 (値は配列の最初の要素のアドレス) に暗黙的に変換できます。int *p=arr;
はそのような文脈です。
p の値は同じになります。あなたが言ったように arr の値が0x1234であると仮定すると、ポインター p は同じ値を取ります.これは、ポインター p には arr 配列のアドレスを保持するのに十分なスペースがあるためです...
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int *p = arr;
arr
との値はp
同じです。
しかし、値は変数の一部にすぎません。変数は、値と型で構成されます。arr
との種類p
が異なります。
comp.lang.c FAQのセクション 6 をお読みください。
の値は の値p
と同じになりますarr
。
理由: 配列の名前はベース アドレスを表し、それを pointer に割り当てていますp
。
配列名は、その最初の要素へのポインターです。例えば:
int a[5];
それから、
a
要素 a[0] を指す int * です。arr の値が
0x1234
p の値は同じになります。ただし、p を使用した配列へのアクセスには注意が必要です (配列の範囲を考慮する必要があります)。