C语言中int (*number)[2]类型含义及示例疑问
关于
int (*number)[2]的类型澄清 int (*number)[2]是指向包含2个int元素的数组的指针,并非含2个元素的数组。你之前查阅到的“共识”是错误的,下面结合你的代码具体解释:
代码行为分析
你的代码中:
#include <stdio.h> int main() { int arr[3][2] = {{1, 2}, {3, 4}, {5, 6}}; int (*number)[2]; number = arr; printf("First element: %d %d\n", (*number)[0], (*number)[1]); // prints "1 2" number++; printf("Second element: %d %d\n", (*number)[0], (*number)[1]); // prints "3 4" return 0; }
arr是int[3][2]类型的二维数组,当它被赋值给number时,数组名arr会隐式转换为指向其第一个元素的指针——arr的第一个元素是int[2]类型的子数组,因此number(指向int[2]的指针)可以正确接收这个地址。(*number)[0]和(*number)[1]是先解引用number,得到arr的第一个int[2]子数组,再访问该子数组的两个元素,所以输出1 2。number++执行的是指针算术:指针的步长等于它指向的类型的大小(这里是2 * sizeof(int)),因此number会直接跳到arr的第二个int[2]子数组的起始地址,解引用后访问元素自然得到3 4。
如何区分类似声明
C语言中声明的优先级规则是关键:
int (*number)[2]:括号()优先级高于[],所以*number先结合,说明number是指针,[2]表明该指针指向的是包含2个int的数组。- 如果是
int *number[2]:[]优先级高于*,会先形成number[2],说明这是一个包含2个元素的数组,每个元素的类型是int*(指向int的指针)。
标准依据补充
根据C语言标准:
- 数组名在大多数语境下(不作为
sizeof、&、_Alignof的操作数时),会隐式转换为指向数组第一个元素的指针。 - 指针进行加减运算时,偏移量的单位是其指向类型的大小,而非字节数。
内容的提问来源于stack exchange,提问作者Linh Tran
相关产品推荐
相关产品推荐

