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]