数组到指针
例子:
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中也不需要更改,可以小偷懒
但是会报错,猜猜是链接错误,编译错误,还是运行时错误?
可能有人认为是编译错误, 但是实际上是运行期的错误
可以编译,链接,但是一运行,就会段错误
为什么呢?
其实是因为数组和指针还是有本质的区别
- 肯定不是编译器错误, 编译其实解决的