学习篇:C语言数组与指针的理解(1[p]是什么玩意儿???)

学习篇:C语言数组与指针

指针

讲C语言的书都会说:

    int *p;

语句声明了一个整形指针p,p中存放了一个地址。
实际上,申明之后,相当于告诉编译器内存的分配方式,编译器就以该地址为起始地址的连续4个内存空间被打包在一起存储一个整形数据。所以执行:

    std::cout<<p<<'/t'<<p+1;

后,会发现前后两个值的差为4,即等于整形被分配的字节数。计算p+1时,该值指向的内存地址是下一个打包区域的起始地址,即为一次性跳过4字节的下一个内存区域。

大家觉得指针被分配了多大的内存空间?

  std::<<sizeof(p);

结果是4,有人说,因为地址总线的宽度为4*8=32位。咦?我的电脑不是64位的么?确实,但64位的CPU64位的电脑可以运行32位的程序,上述的结果和你的编译器有关。

数组

int p[5] = {32,45,12,56,77};
std::cout<<"\nP:"<<P;
std::cout<<"\n*p:"<<*P;
std::cout<<"\np[1]:"<<p[1];
std::cout<<"\n1[p]"<<1[p];
std::cout<<"\n*(p+1)"<<*(p+1);
std::cout<<"\n*(1+p)"<<*(1+p);        

执行上述语句的结果为:

p:      00CFF874
*p:     32
p[1]:   45
1[p]:   45
*(p+1): 45
*(1+p): 45

数组名即为指向该数组空间的指针。可以通过第一个输出看到,输出的结果为该数组所在内存空间的起始地址。

对于编译器来说,p[i]和 *(p+i) 是完全等价的。

编译器对p[i]的处理也是转化为 *(p+i)来执行的。

因此运用加法交换律,*(i+p)可以顺利执行,i[p]也完全不会出错。也就是说,你写成2[p],0[p]是完全正确的。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值