2012-08-08 105 views
5

我有一个节目约2-d阵列请解释差

基ADRESS是8678

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
int arr[3][3]={ 
       {83,8,43}, 
       {73,45,6}, 
       {34,67,9} 
       }; 
printf("%d ",&arr+1); //points to 8696 
printf("%d ",arr+1); //points to 8684 
return 0; 
} 

是什么arr+1&arr+1之间的差异?

回答

9

嗯,它们是不同的东西。在大多数情况下,arr会衰减到指向数组第一个元素的指针 - 这意味着指向您的二维数组中第一个3元素行的指针:键入int (*)[3]arr + 1然后指向数组中的第二行。

&arr是阵列本身的地址(类型int (*)[3][3]),所以&arr + 1指向刚刚超过整个2D阵列末端的存储器。

您可以通过不同的打印轻松地确认此行为。具体而言,将偏移量打印到新指针而不是值本身将有助于清除问题。从你的程序的输出从这些打印语句:

printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr); 
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr); 

将是小数偏移&arr+1arr+1分别。下面是从一个测试运行输出I刚才:

36 
12 

36相匹配:3行×3列每个条目×4字节= 36个字节。那么每个条目的12:1行×3列×4字节= 12个字节。

请注意 - 您也在使用%d打印指针,这是错误的。你可能应该使用%p

+2

的下一个数组的地址,我从你的答案学到了很多。谢谢。 – 2012-08-08 04:57:13

+0

使用'%p',您需要将指针转换为'void *'。 – 2012-08-08 05:29:41

1

您可以使用此等价的帮助下算出来:X [Y] === *(X + Y)

由于*(ARR + 1)===常用3 [1],编曲+ 1个=== & ARR [1]

同样,& ARR + 1 === &((& ARR)[1])

什么是(& ARR)[1]?井,(& ARR)[0] === * & ARR === ARR, 即,3×3阵列本身,因此(& ARR)[1]在所述3×3阵列紧接着, 和& ARR + 1 === &((& arr)[1])是跟在&之后的3x3阵列的地址...指向刚刚经过整个阵列的字节的指针。

-1

array + 1表示数组[1]的地址,它需要3个int内存。

& array + 1表示array [0]的地址add 1;

+0

错误。试试看,你会看到。甚至只是看看OP的输出,我想。 – 2012-08-08 15:25:10

+0

泳池英语让你误解我。数组是指向数组地址的指针,(数组+ 1)是指向数组[1]的地址的指针。 &array是数组的地址,然后加上1. – hupantingxue 2012-08-16 07:27:21

+0

Carl Norum,你误解了我。 – hupantingxue 2012-08-16 07:31:55

0

编曲+ 1给出了一个数组的下一个元素,而&改编+1给出整数