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
相关产品推荐
相关产品推荐

