C语言中数组可作函数参数传入为何不能直接赋值给另一数组
C语言数组赋值与指针差异原理说明
核心结论
C语言中数组名是不可修改的左值,且数组类型和指针类型存在本质差异,是不同场景表现不一致的核心原因。
分场景解释
1. 为什么b = a+6会编译报错
- 你定义的
b类型是char[15],属于数组类型。C标准明确规定:数组类型的左值不能出现在赋值运算符的左侧,无法被直接赋值。 - 表达式
a+6的类型是char*(数组名参与运算时会自动退化为指向首元素的指针,偏移6个单位后仍是指针类型),将指针赋值给数组类型本身就存在类型不匹配问题,编译自然报错。
2. 为什么foo(a+6)可以正常运行
- 函数参数声明的
char arr[]看起来是数组类型,实际C语言会自动将作为函数参数的数组类型退化为对应指针类型,也就是说这个参数的真实类型是char *arr。 - 你传入的
a+6是char*类型,和参数类型完全匹配,本质是把字符串"world"的首地址传给了函数,所以运行输出正常。
3. 为什么改成char *b后赋值可以正常运行
- 此时
b的类型是字符指针,属于可修改的左值,允许被赋值。 a+6的char*类型和b的类型完全匹配,赋值后b指向a数组下标为6的元素的地址,后续通过%s输出时,就会从该地址开始读取直到遇到\0,输出结果符合预期。
额外补充
如果需要将a+6指向的字符串内容复制到b数组的内存空间中,不要直接赋值,应该使用字符串拷贝函数:
strcpy(b, a+6);
该函数会把a+6指向的字符串内容逐字符复制到b对应的连续内存空间中,符合数组内容复制的预期。
内容的提问来源于stack exchange,提问作者Giri prakash
相关产品推荐
相关产品推荐

