我创建了一个二维数组,并尝试打印某些值,如下所示:
int a[2][2] = { {1, 2},
{3, 4}};
printf("%d %d\n", *(a+1)[0], ((int *)a+1)[0]);
输出是:
3 2
我明白为什么 3
是第一个输出(a+1
指向第二行,我们打印它的 0th
元素。
我的问题是关于第二个输出,即 2
。我的猜测是,由于将 a
类型转换为 int *
,二维数组被视为一维数组,因此 a+1
充当指向 2nd
元素的指针,因此我们得到输出为 2
。
我的假设是否正确,或者这背后是否有其他逻辑?
另外,当把 a
当作指针 int (*)[2]
或 int **
时,原来的类型是什么?
最佳答案
当你写表达式时
(int *)a
那么逻辑上原始数组可以通过以下方式被认为是一维数组
int a[4] = { 1, 2, 3, 4 };
所以表达式 a
指向这个假想数组中等于 1 的第一个元素。表达式 ( a + 1 )
指向虚数数组中等于 2 的第二个元素,表达式 ( a + 1 )[0]
返回对这个元素的引用,即你得到 2 个。
关于c++ - 二维数组的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791943/