Arrays 如何及;a[i][j]的计算结果为*(a+;i)+;J
a[3][3]={1,2,3,4,5,6,7,8,9} 如果我想使用*(a+I)+j获得[2][3]的地址 根据我的说法,*(a+2)将给我3(考虑行顺序)和j=3,因此它的计算结果为3+3=6Arrays 如何及;a[i][j]的计算结果为*(a+;i)+;J,arrays,c,pointers,Arrays,C,Pointers,a[3][3]={1,2,3,4,5,6,7,8,9} 如果我想使用*(a+I)+j获得[2][3]的地址 根据我的说法,*(a+2)将给我3(考虑行顺序)和j=3,因此它的计算结果为3+3=6 它将如何给出地址?只需删除j(3)并将3添加到i。无需添加j*a是数组第一个元素的地址**a=1,所以*a+2表示将2添加到第一个元素的地址,它将成为第三个元素的地址*(a+5)是a[2][3]的地址。你的作业也应该是a[3][3]={{1,2,3},{4,5,6},{7,8,9}正如您显然知道的,&a
它将如何给出地址?只需删除j(3)并将3添加到i。无需添加j*a是数组第一个元素的地址**a=1,所以*a+2表示将2添加到第一个元素的地址,它将成为第三个元素的地址*(a+5)是a[2][3]的地址。你的作业也应该是a[3][3]={{1,2,3},{4,5,6},{7,8,9}正如您显然知道的,
&a[2][3]
被定义为*(a+2)+3
。下面是该表达式的计算方式:
a
是一个由3个数组组成的数组,其中3个int
。a
的元素有a[0]
、a[1]
和a[2]
a+2
中使用a
时,a
自动转换为指向其第一个元素的指针。所以a
变成&a[0]
,一个指向a[0]
的指针+
定义,将2
添加到指向a[0]
的指针会生成指向a[2]
的指针。所以a+2
就是&a[2]
*(a+2)
是a+2
指向的对象,因此它是a[2]
*(a+2)+3
就是a[2]+3
a[2]
是一个由3int
组成的数组。It元素有a[2][0]
、a[2][1]
和a[2][2]
a[2]+3
中,a[2]
自动转换为指向其第一个元素的指针。因此a[2]
变成&a[2][0]
,表达式是&a[2][0]+3
+
的定义,将3
添加到指向a[2][0]
的指针将生成指向a[2][3]
的指针。没有元素a[2][3]
,但是指针算法允许超出数组的末尾。您可以使用该指针作为端点,尽管那里没有定义的元素,并且您不应该取消对指针的引用*(a+2)+3
给出的地址正好超出子数组的末尾a[2]
简单-如果
a[i] == *(a + i)
然后
所以
&a[i][j] == *(a + i) + j
表达式
a[i]
的类型为“int的三元素数组”。除非它是sizeof
或一元&
运算符的操作数,否则它将被转换或“衰减”为类型“指向int
”或int*
。因此,a[i]+j
给你一个指针值,而不是整数值。你确定要a[2][3]的地址吗?这是越界的,因为在C中,索引从0开始,而不是从1开始,我想要一个[1][2],所以在2d数组中,a[2]将充当指向a[2]行第一个元素的数组指针,也就是说,根据你的说法,*(a+2)+3是[2]+3,那么*(a+2)+3将如何给出地址?@Pranjalakg:在第5步,*(a+2)+3
显示为a[2]+3
。在步骤7中,a[2]
被转换为&a[2][0]
,因此我们有&a[2][0]+3
,这是一个地址加上一个整数。在第8步中,这个加法产生了a[2][3]
的地址。非常感谢,但根据第8步(a+2)+3应该给出的地址不是*(a+2)+3,也就是我唯一的最后一个疑问?@Pranjalakg:In*(a+2)+3
,*(a+2)
是数组a[2]
,它会自动转换为&a[2][0]/code>,然后加上3就得到了&a[2][3]
。在(a+2)+3
中,a
是&a[0]
,因此a+2
是&a[2]
,然后(a+2)+3
将是&a[2]+3
,这将是&a[5]
,这是无效的,因为它超出了a
的末尾。
&a[i][j] == *(a + i) + j