私は次のコードを試していました
#include<stdio.h>
int main()
{
int A[3][4] = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};
int **t = &A[0]; //I do this or **t = A,I guess both are equivalent
printf("%d %p\n\n",*t,A[0]);
return 0;
}
私が期待したこと:
ここで、t は A[0] のアドレスを保持する 2d ポインター (ポインターへのポインター) であり、A[0][0] のアドレスを保持します。したがって、 *t は A[0] の値、つまり A[0][0] のアドレスを提供し、 **t は A[0][0] の値を提供する必要があります。この場合は 1 です。 .
私が得たもの:
*t の値は 1 でした。セグメンテーション違反が発生したため、**t を見つけようとしてもできませんでした。
なぜこれが起こっているのか誰にも教えてもらえますか?
次の説明を試みましたが、それが「正しい」説明かどうかはわかりません。t は A[0] のアドレスを保持しますが、 A は配列であり、 A[0] は配列ポインター (「厳密には」ポインターではない) であるため、C はポインター A または A[0] にメモリを割り当てません。特に UNLIKE 他のポインター変数。配列全体にのみメモリを割り当てます。したがって、A[0] と A[0] (A[0][0] のアドレス) のアドレスは本質的に同じであり、両方とも 1 つの屋根の下に属しており、「別個の」エンティティとは異なります。その結果、t は間接的に A[0][0] のアドレスを保持し、*t は A[0][0] の値 (1) を与えます。
上記の説明は正しいですか?ちょっと奇妙に見えます。