いいえ、コードに問題はありません。考えれば考えるほど、これを説明するのが難しいことに気付くので、これに入る前に、次の点を念頭に置いてください。
- 配列はポインターではありません。そのように考えないでください。それらは異なる型です。
- [] は演算子です。これはシフトとディファレンスの演算子なので、書く
printf("%d",array[3]);
ときはシフトとディファレンシングをしています
したがって、配列 (最初に 1 次元について考えてみましょう) はメモリ内のどこかにあります。
int arr[10] = {1};
//Some where in memory---> 0x80001f23
[1][1][1][1][1][1][1][1][1][1]
だから私が言うなら:
*arr; //this gives the value 1
なんで?arr[0]
配列の先頭であるアドレスの値を与えるのと同じだからです。これは、次のことを意味します。
arr; // this is the address of the start of the array
それで、これは私たちに何を与えますか?
&arr; //this will give us the address of the array.
//which IS the address of the start of the array
//this is where arrays and pointers really show some difference
だからarr == &arr;
。配列の「仕事」はデータを保持することです。配列は独自のデータを保持しているため、他のものを「指す」ことはありません。限目。一方、ポインターには、何か他のものを指す仕事があります。
int *z; //the pointer holds the address of someone else's values
z = arr; //the pointer holds the address of the array
z != &z; //the pointer's address is a unique value telling us where the pointer resides
//the pointer's value is the address of the array
編集:
これについて考えるもう1つの方法:
int b; //this is integer type
&b; //this is the address of the int b, right?
int c[]; //this is the array of ints
&c; //this would be the address of the array, right?
したがって、これについてはかなり理解できます。
*c; //that's the first element in the array
そのコード行は何を教えてくれますか? deferencec
の場合、int を取得します。つまり、プレーンc
はアドレスです。これは配列の先頭であるため、配列のアドレスです。したがって、次のようになります。
c == &c;