You need to enable JavaScript to run this app. C语言中数组可作函数参数传入为何不能直接赋值给另一数组
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:27:03