深入理解C中的数组指针

代码说明一切:

int main(void)
{
    int nArr[5] = {1,2,3,4,5};
    int n = 20;

    printf("nArr     = %x\n", nArr);
    printf("&nArr    = %x\n", &nArr);
    printf("&nArr    = %x\n", &nArr[0]);

    printf("nArr+1   = %x\n", nArr+1);
    printf("&nArr+1  = %x\n", &nArr+1); /* (nArr+1 != &nArr+1) */
    printf("nArr+5   = %x\n", nArr+5);

    printf("\n\n");

    int *ptr;
    ptr=(int *)(&nArr+1);
    printf("*nArr    = %d\n", *nArr);
    printf("*(ptr-1) = %d\n", *(ptr-1));
    /*
    上面运行的结果为:1,5 为什么会是这个结果呢?
    这是因为数组名和数组名取地址之间是有区别的。
    其实a和 &a结果都是数组的首地址,但他们的类型是不一样。
    其实a表示&a[0],也即对数组首元素取地址,
    a+1表示 首地址+sizeof(元素类型大小)。
    &a虽然值为数组首元素地址,
    但类型为:类型 (*)[数组大小],
    所以&a+1大小为:首地址+sizeof(a)
    */
    return 0;
}

特别注意后两句!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值