You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:05:06