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

