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

C语言中int x[]与int *x[]的实际实用差异是什么?

数组与指针数组的本质区别

先看你给出的代码:

int x[] = {1, 2, 3};
int *y[] = {4, 5, 6};

关于x的本质

x是一个**int[3]类型的一维数组**(即包含3个int元素的数组),它本身是一块连续的内存区域,存储着1、2、3这三个整数值,不是指针。

当你在表达式中使用x(比如printf("%u", x))时,C语言会自动对它做隐式类型转换,将其转为指向数组第一个元素的指针,类型为int *——这就是你看到输出数组首元素地址的原因。但要明确两个关键点:

  • 数组名x是不可赋值的左值,比如x = &x[1];属于非法代码,因为数组是固定的内存对象,不是可修改的指针变量。
  • 使用sizeof(x)会得到整个数组的字节大小(例如3×4=12,假设int占4字节),而非指针的大小。

关于y的本质

y是一个**int*[3]类型的指针数组**(即包含3个int*类型指针的数组)。

你代码里的{4,5,6}是直接把整数赋值给指针,这相当于把这些整数当作内存地址来使用,属于不规范写法(大概率会指向无效内存,触发未定义行为),但语法上多数编译器会允许。

当你在表达式中使用y时,它同样会被隐式转换为指向第一个元素的指针,但这个指针的类型是int **(二级指针)——因为y的元素本身就是int *类型的指针。

  • y作为数组名同样不可被赋值,但它的元素是可修改的指针变量,比如y[0] = &x[1];是完全合法的。
  • 使用sizeof(y)得到的是整个指针数组的字节大小(例如3×8=24,假设指针占8字节),sizeof(y[0])则会得到单个int*指针的大小。

核心区别总结

  • 本身类型:x是int[3](int数组),y是int*[3](int指针数组)。
  • 隐式转换后的指针类型:x转为int *,y转为int **。
  • 元素类型:x的元素是int类型的数值,y的元素是int *类型的指针。
  • 可操作特性:两者作为数组名都不可被赋值,但y的元素是可修改的指针变量,x的元素是可修改的int变量(比如x[0] = 10;是合法的)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:52:46