C与C++中数组退化为指针的情况
数组退化的常见场景:
1、函数的参数传递
void func(int arr[]) { // 实际上是指针 int* arr
// sizeof(arr) 是指针大小,不是数组大小
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
func(arr); // arr退化为int*
}
2、赋值给指针
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // 自动退化
- 算术运算
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr + 2; // arr退化为指针后做指针运算
不会退化的例外情况:
- sizeof运算符
int arr[5] = {1, 2, 3, 4, 5};
printf("%zu\n", sizeof(arr)); // 20(5*4),不是指针大小
- &运算符
int arr[5];
int (*ptr)[5] = &arr; // 获取的是整个数组的指针
- 字符串初始化
char str[] = "hello"; // 不会退化
重要注意事项:
1、丢失大小信息:退化后,编译器不知道数组的边界
2、无法拷贝数组:数组名不能直接赋值给另一个数组
3、指针和数组的差异:
浙公网安备 33010602011771号