请解释一下差异

时间:2012-08-08 04:33:09

标签: c pointers multidimensional-array

我有一个关于二维数组的程序

基地址是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之间有什么区别?

4 个答案:

答案 0 :(得分:9)

嗯,他们是不同的东西。 arr在大多数上下文中衰减为指向数组第一个元素的指针 - 这意味着指向2D数组中第一个3元素行的指针:type 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的十进制偏移量。这是我刚刚进行的测试运行的输出:

36
12

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

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

答案 1 :(得分:1)

你可以借助这个等价来解决这个问题:X [Y] === *(X + Y)

由于*(arr + 1)=== arr [1],arr + 1 ===&amp; arr [1]

同样,&amp; arr + 1 ===&amp;((&amp; arr)[1])

什么是(&amp; arr)[1]?好吧,(&amp; arr)[0] === *&amp; arr === arr, 也就是说,3x3阵列本身,所以(&amp; arr)[1]是之后的3x3阵列, 和&amp; arr + 1 ===&amp;((&amp; arr)[1])是跟随&amp; arr ...的3x3数组的地址...指向刚好超过整个数组的字节的指针。

答案 2 :(得分:0)

Arr + 1给出数组中的下一个元素,而&amp; arr +1给出下一个整数数组的地址

答案 3 :(得分:-1)

array + 1表示数组[1]的地址,它的成本为3 int。

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