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

在C语言中*与[]是否等价?两组代码写法等效性问询

嘿,这个问题问到点子上了,很多刚摸C语言的小伙伴都会在指针和数组的声明上绕晕,我给你拆成两部分讲清楚~

函数参数里的char *argv[]和char **argv:确实等价!

当你把char *argv[]写在函数参数列表里的时候,C编译器会自动把它转换成char **argv来处理——这是C语言里的一个特殊规则:函数参数中的数组类型会被隐式转换为指向数组首元素的指针。

最典型的例子就是main函数,不管你写int main(int argc, char *argv[])还是int main(int argc, char **argv),编译器都会当成一回事儿处理,完全没有区别。不过要记住,这个等价性只限于函数参数场景,别的地方可不能这么套。

普通变量声明里的指针和数组:完全不等价!

你举的char *string1; vs char string1[];、int *int_array; vs int int_array[];,这两组可差远了,我给你掰碎了说:

  • 内存分配不一样
    • char *string1;是声明一个指针变量,它本身只占一个指针的内存(32位系统4字节,64位8字节),如果是局部变量的话,初始值是随机的,根本没给字符串分配存储空间。你得手动让它指向某个已有的字符串或者用malloc申请空间才行。
    • char string1[];这种写法其实不完整(全局变量除外,全局未初始化数组会被放到bss段),如果是局部变量这么写直接编译报错。要是写成char string1[] = "hello";,那编译器会分配6个字节的连续内存(存"hello"加末尾的'\0'),string1是数组名,本质是个指向首元素的常量指针——意思就是你不能改它的指向。
  • 可修改性不一样
    • 指针变量string1可以随便改指向,比如string1 = "world";是合法的(不过要注意字符串字面量是只读的,别去修改它的内容)。
    • 数组名string1是常量,你要是写string1 = "world";,编译器直接给你报错,因为数组名不能当左值赋值。
  • 存储的东西不一样
    • int *int_array;存的是一个地址,可能是某个int变量的地址,也可能是malloc出来的数组首地址,但它本身不存数组元素。
    • int int_array[5];是直接分配了5个int大小的连续内存,专门用来存数组元素,数组名固定指向这个内存块的开头,动不了。

总结一下:只有函数参数里的数组声明会被当成指针,这时候才等价;普通变量声明里,指针和数组是完全不同的两种东西,可不能混为一谈哦~

内容的提问来源于stack exchange,提问作者alt.126

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:03:48