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

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语言标准:

  1. 数组名在大多数语境下(不作为sizeof、&、_Alignof的操作数时),会隐式转换为指向数组第一个元素的指针。
  2. 指针进行加减运算时,偏移量的单位是其指向类型的大小,而非字节数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:12:21