C语言中int (*arr2)[10]等复杂声明的含义及相关疑问
C语言数组与指针声明解析
先看两个直观的声明:
int arr[10]; int *arr1[10];
arr是包含10个int类型元素的数组,每个元素直接存储整数。arr1是包含10个int*类型指针的数组,每个元素存储指向int的指针。
接下来分析带括号的声明:
int (*arr2)[10]; int *(*arr3)[10];
关于int (*arr2)[10];
- arr2本身的类型:指向“包含10个
int元素的数组”的指针,即int (*)[10]类型。 - 括号的作用是改变优先级:如果没有括号,
int *arr2[10]会被解析为指针数组;括号让*arr2先结合,明确arr2是一个指针,指向的对象是长度为10的int数组。 - 执行
*arr2得到的值:它指向的那个长度为10的int数组本身(数组名会隐式转换成指向首元素的指针,即int*类型)。 - 声明里的
(*arr2)不是对arr2解引用,而是C语言声明语法的规则——通过“声明写法与使用写法一致”的逻辑,告诉编译器arr2是指针,解引用后得到的是长度为10的int数组。
关于int *(*arr3)[10];
- arr3本身的类型:指向“包含10个
int*类型指针的数组”的指针,即int *(*)[10]类型。 - 同样,括号让
*arr3先结合,明确arr3是指针,指向的对象是长度为10的int*数组。 - 执行
*arr3得到的值:它指向的那个长度为10的int*数组本身(数组名隐式转换成指向首元素的指针,即int**类型)。
总结
arr2是指向int[10]数组的指针,*arr2得到该数组(隐式转为int*);arr3是指向int*[10]数组的指针,*arr3得到该数组(隐式转为int**);- 声明中的括号是语法要求,用来修正优先级、明确变量的指针属性,并非对变量执行解引用操作。
内容的提问来源于stack exchange,提问作者Black Wind
相关产品推荐
相关产品推荐

