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

C语言中指针数组声明时括号的作用及相关写法差异咨询

C语言数组指针与指针数组的区别解析

C语言里[](数组下标)的优先级高于*(指针解引用),括号()可以改变优先级顺序,这是理解以下几个定义的核心。

1. int *a[10]; 与 int (*a)[10]; 的区别

int *a[10];

这是指针数组的定义:

  • 由于[]优先级更高,a首先被解析为一个长度为10的数组。
  • 数组的每个元素都是int*类型,也就是指向整数的指针。直白点说:这是一个装了10个“整数指针”的数组。

int (*a)[10];

这是指向数组的指针(数组指针)的定义:

  • 括号()强制让*先与a绑定,所以a本质是一个指针。
  • 这个指针的指向对象是一个包含10个int元素的数组。简单说:这是一个专门用来指向“10个整数组成的数组”的指针。

2. int (*a)[10]; 中 * 的作用

这里的*就是用来明确a的指针属性,告诉编译器“a不是数组,是个指针”。
如果去掉括号,int *a[10]会被优先解析为数组;加上括号后,(*a)把指针声明的优先级提前,让编译器先识别出a是指针,再确定它指向的是长度为10的int数组。

3. int (*a)[10]; 与 int a[10]; 的区别

int a[10];

  • 直接声明一个包含10个int元素的数组。
  • a是数组名,代表数组的首地址,但它是常量,不能被赋值(比如a = &b;是非法操作)。
  • 数组本身会占用对应内存,用来存储10个int类型的值。

int (*a)[10];

  • 声明一个指针变量,类型为“指向10个int元素的数组的指针”。
  • a是变量,可以被赋值,比如指向另一个同类型数组:
    int b[10];
    int (*a)[10] = &b; // 合法,&b是整个数组的地址,与a的类型匹配
    
  • 这个指针仅占用一个指针大小的内存(比如32位系统占4字节,64位系统占8字节),它不存储数组元素,只记录数组的地址。

内容的提问来源于stack exchange,提问作者Abenaki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:00:10