首页 > 解决方案 > 为什么我在二维数组中得到“a+1”和“&a+1”的不同结果?

问题描述

#include<stdio.h>
#include<conio.h>

int main()
{
    int a[3][4] = {1, 2, 3, 4, 4, 3, 2, 1, 7, 8, 9, 0};
    clrscr();    
    printf("%u \n",a);
    printf("%u, %u\n", a+1, &a+1);
    getch();
    return 0;
}

输出:65502 65510 65526

sizeof(int)=2如果基地址为,该程序如何工作65502

标签: arrayscpointers

解决方案


当你在表达式中使用数组a时,它通常会经历“指针衰减”,这意味着你会得到一个指向数组第一个元素的指针。

所以,a有 type int[3][4],它衰减到int (*)[4]。当你写的时候a+1,你会得到a[1]…的地址,它是sizeof(*a)之后的字节a,也就是sizeof(int)*4,在你的系统上是 8。

使用 时&,不会发生指针衰减。&a不是一个数组(它已经是一个指针),所以当你写的时候,你得到的地址是……&a+1的“结束后”的地址,它是a 之后的字节,即,或系统上的 24 个字节。asizeof(a)sizeof(int)*12

请注意,严格来说,打印指针的正确方法是使用%p.

printf("%p\n", a);
printf("%p, %p\n", a+1, &a+1);

(从技术上讲,您还必须转换为char *orvoid *但这并不重要。)


推荐阅读