将2-D数组分配给指针

时间:2016-04-24 12:54:05

标签: c arrays pointers

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]);

3 个答案:

答案 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 *。