int matrix[4][3] = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}};
int** pmat = (int **)matrix;
printf("&matrix[0][0] = %u\n", &matrix[0][0]);
printf("&pmat[0][0] = %u\n", &pmat[0][0]);
这两个陈述的输出是不一样的,为什么? 这是输出
&matrix[0][0] = 1245016
&pmat[0][0] = 1
此外,我得到
的分段错误printf("pmat[0][0] = %u\n", pmat[0][0]);
答案 0 :(得分:2)
表达式matrix
的类型为“{element(1}}的3元素数组的4元素数组”;除非它是int
或一元sizeof
运算符的操作数,否则它会衰减“指向&
或int
的3元素数组的指针,因此{{1应该声明为
int (*)[3]
打印指针值时,应使用pmat
转换说明符并将指针值强制转换为int (*pmat)[3] = matrix;
:
%p
这几乎是C中唯一需要显式转换void *
值的地方。
答案 1 :(得分:1)
您可能听说过数组(const_cast<MyClass*>(this)->*f)();
与“指针const_cast
”相同。
这不是真的。在大多数情况下会发生什么,数组会自动转换为指向其第一个元素的指针。同样正确的是,指针可以很好地用于访问数组。
但接下来你需要知道的是所有这些都只适用于 到一维数组和单级指针。
您不能将两级指针int []
设置为指向二维数组int *
,并且您不能使用这种指针来访问该类型的数组。原因是两级指针int **
期望指向一个或多个指向一个或多个int [][]
的单级指针int **
。但是当你声明并初始化一个二维数组int *
时,你所拥有的只是一个数组; ints
指向的地方没有任何指针。
使用一些图片更容易理解这一点,但是(AFAIK)Stack Overflow不会拍照。这里是a page with两级指针的内存分配情况的图片。不幸的是,没有相应的“传统”二维阵列图片,但相信我,它看起来不同。
答案 2 :(得分:-1)
输出不同,因为矩阵[0] [0]是二维数组的元素,而&amp; matrix [0] [0]是该元素的地址。
int** pmat
是指向二维数组的指针,所以当你写&pmat[0][0]
就像你写*pmat
时那样,因为*和&amp;彼此中立。
你应该更好地学习指针,但这不是网站。
我认为困扰你的主要因素是这部分:
int** pmat = (int **)matrix
;
您将int *转换为int **,但您只是这样做,因此pmat获取正确的值,但在此之后,矩阵仍然具有类型int *。