指针与数组的区别
00:00
C语言指针与数组的区别:sizeof、&运算、传参差异。
1. sizeof 差异
int arr[10];
int *ptr = arr;
sizeof(arr); // 40 = 10 * sizeof(int)
sizeof(ptr); // 8(64位系统)或 4(32位系统)
数组:sizeof 返回整个数组大小
指针:sizeof 返回指针本身大小
2. & 运算差异
int arr[10];
&arr; // 类型: int (*)[10],指向整个数组的指针
&arr + 1 // 偏移 sizeof(int[10]) = 40 字节
arr; // 类型: int*,指向首元素
arr + 1 // 偏移 sizeof(int) = 4 字节
3. 赋值差异
int arr[10];
int *ptr = arr; // 数组名可隐式转为指针
arr = ptr; // 数组名不可赋值(不是左值)
arr++; // 数组名不可自增
ptr++; // 指针可自增
4. 函数参数
// 数组作为参数时退化为指针
void func(int arr[]) {
sizeof(arr); // 8(指针大小,不是数组大小)
}
// 等价于
void func(int *arr) {
sizeof(arr); // 8
}
5. 多维数组
int matrix[3][4];
// matrix 的类型: int (*)[4]
// matrix[i] 的类型: int*
// matrix[i][j] 的类型: int
sizeof(matrix); // 48 = 3*4*sizeof(int)
sizeof(matrix[0]); // 16 = 4*sizeof(int)