在C语言中,int()[5]和int是两种完全不同的指针类型,理解它们的区别对于正确处理数组和多维数组至关重要。下面详细解释:
1:int*(指向整型的指针)
- 含义:指向单个int类型数据的指针
- 典型用法:
int a = 10;
int* p = &a; // p指向一个int变量
- 与一维数组的关系:
int arr[5] = {1, 2, 3, 4, 5};
int* p = arr; // arr自动转换为&arr[0],类型是int*
2:int(*)[5](指向数组的指针)
- 含义:指向一个“包含5个int元素的数组”的指针,而非指向单个int
- 典型用法:
int arr[5] = {1, 2, 3, 4, 5};
int (*p_to_array)[5] = &arr; // p_to_array指向整个数组
- 关键区别:
1:p_to_array的类型是int()[5],表示“指向一个长度为5的int数组的指针”
2:对p_to_array解引用(p_to_array)会得到整个数组(类型是int[5]),而p_to_array又会自动退化为int(指向数组首元素)
3: 为什么&arr的类型是int(*)[5]?
-
arr是一个长度为5的int数组,&arr表示“取整个数组的地址”,因此类型是指向数组的指针(int(*)[5])
-
这与&arr[0](类型是int*)不同:
printf("%p\n", &arr); // 类型:int(*)[5],指向整个数组
printf("%p\n", &arr[0]); // 类型:int*,指向首元素
- 虽然两者的内存地址值相同,但指针类型不同,导致指针运算的行为不同(见下文)。
4: 类型差异导致的指针运算区别
- int*的算术以int为单位:
int* p = arr;
p++; // 移动sizeof(int)字节(如4字节),指向arr[1]
- int(*)[5]的算术以“整个数组”为单位:
int (*p_to_array)[5] = &arr;
p_to_array++; // 移动sizeof(int[5])字节(如20字节),指向“下一个长度为5的数组”
- 如果arr是单独定义的数组,p_to_array++会越界(因为不存在下一个数组)
5:例子1
6:例子2,输出结果是相同的
int arr[5] = {1, 2, 3, 4, 5};int (*p_to_array)[5] = &arr; // p_to_array指向整个数组printf("%d\n", (*p_to_array)[2]);int arr2[5] = {1, 2, 3, 4, 5};int *p_to_array2 = &arr2; // p_to_array2指向整个数组printf("%d\n", *(p_to_array2+2));