【重学c++primer】第四章第三节 深入浅出:从数组到指针

数组到指针

例子:

int a[3] = {1,2,3};
auto b = a; // decay to pointer, 类型的退化/转化

大多数时候, 数组都会转化为指针, 还是有些情况不会
比如之前提到的decltype(a), 此时就只会返回`int[3];
还比如:sizeof(a)

这种转换是一种隐式的转换, 会丢失一部分信息
比如上面的例子, a的类型是int[3], 但是b的类型是int*, 其中丢失的信息就是3, 3的含义就是元素的个数为3
还可以使用引用来避免类型转换, 例如:auto& b = a;
此时b的类型为int(&)[3]

一般这种隐式的类型转换不会带来什么影响,但是还是有一些地方需要注意
比如说:

// main.cpp
extern int b[4];    // 数组的声明

// source.cpp
int b[4] = {1,2,3,4};   // 没问题,只要有include就是正确的

// main.cpp
extern int* a;  // 声明一个指针

int mian()
{
    cout << a[0];   // error
    return 0;
}

// source.cpp
int a[4] = {1,2,3,4};   // 定义一个指针

上述的第二个例子企图使用数组会隐式转换成指针来完成数组的声明,这样在source.cpp文件中,即使更改了数组的下标,在main.cpp中也不需要更改,可以小偷懒

但是会报错,猜猜是链接错误,编译错误,还是运行时错误?
可能有人认为是编译错误, 但是实际上是运行期的错误
可以编译,链接,但是一运行,就会段错误
为什么呢?
其实是因为数组和指针还是有本质的区别

  1. 肯定不是编译器错误, 编译其实解决的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值