配列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 を使用した配列へのアクセスには注意が必要です (配列の範囲を考慮する必要があります)。