Kev*_*rds 16 c c++ arrays pointers output
我创建了一个2D数组,并尝试打印某些值,如下所示:
int a[2][2] = { {1, 2},
{3, 4}};
printf("%d %d\n", *(a+1)[0], ((int *)a+1)[0]);
Run Code Online (Sandbox Code Playgroud)
输出是:
3 2
Run Code Online (Sandbox Code Playgroud)
我理解为什么3是第一个输出(a+1指向第二行,我们打印它的0th元素.
我的问题是关于第二个输出,即2.我的猜测是,由于类型转换a为int *,所述2D阵列像一维数组进行处理,并且因此a+1充当指向2nd元素,所以我们得到的输出作为2.
我的假设是正确的还是背后还有其他一些逻辑?
另外,原来什么是a被当作指针int (*)[2]或int **?的类型?
Vla*_*cow 10
当你写表达式
(int *)a
Run Code Online (Sandbox Code Playgroud)
那么逻辑上原始数组可以通过以下方式被视为一维数组
int a[4] = { 1, 2, 3, 4 };
Run Code Online (Sandbox Code Playgroud)
因此表达式a指向第一个元素,等于这个虚构数组的1.表达式( a + 1 )指向虚数组的第二个元素,等于2,表达式 ( a + 1 )[0]返回对此元素的引用,即得到2.
我的假设是正确的还是背后还有其他一些逻辑?
是.
*(a+1)[0]相当于a[1][0].
((int *)a+1)[0]相当于a[0][1].
说明:
a衰减指向2D数组的第一个元素,即指向第一行.*a取消引用该行为2的数组int.因此*a可以将其视为第一行的数组名称,它进一步衰减到指向其第一个元素的指针,即1.*a + 1将指向第二个元素.解除引用*a + 1会给出1.所以:
((int *)a+1)[0] == *( ((int *)a+1 )+ 0)
== *( ((int *)a + 0) + 1)
== a[0][1]
Run Code Online (Sandbox Code Playgroud)
需要注意的是a,*a,&a,&a[0]和&a[0][0]都具有相同的地址值虽然他们是不同类型的.衰变后,a是类型int (*)[2].将其转换为int *仅使地址值键入int *,算术(int *)a+1给出第二个元素的地址.
另外,原来什么是被当作指针
(int (*)[2]或int **?的类型?
它成为2的数组int的类型指针,即int (*)[2]