关于c++内置数组和数组指针的总结

内置数组和数组指针完全是两种类型,
比如
int *p=new int[4];
for(auto i:p){
    cout<<i;
}
就会出错,而
int p[4]={};
for(auto i:p){
    cout<<i;
}
就不会出错。
原因是第二个p是数组类型,允许begin函数取位置,第一个p是指针,不能用Begin函数取位置。

一开始读c++primer时,书中说在对于数组p[4];我们取*p的时候会得到该数组第一个位置的值,而且在将数组作为函数参数传递时,编译器也会将其转化为指针传递。当时就武断地认为, 数组其实就是指针
但是之后我做了如下实验
int p[] = { 1,2,3 };
typedef decltype(p) type1;
type1 p1 = new int (2);
编译器会告诉我,p1应该使用{...}初始化聚合类型,然后该为如下:
type1 p1={1,2,3,4};
这时编译器会说,初始值设定的太多,那么改为:
type1 p1={1,2,3};

通过编译,不再报错。这说明通过decltype(p)所得到的type1是一个int[3]类型,不是个指针类型,编译器只不过在对数组遍历的时候会将各元素按指针的方式读取与存储,但是在编译器中还是将其标识为了数组类型。


学习c++常常要和编译器打交道,了解编译器的结构和工作原理绝对对编写c++程序大有裨益,推荐大家读一下《编译器工程》这本书,很有实用性。《编译原理》这本书理论知识占太多了,我当时啃了一个月,实在读不下去了,而《编译器工程》则通俗易懂,满书皆是干货。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值