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

为何C语言中无法将数组直接赋值给另一数组?

为什么C语言里数组不能直接用=赋值?

这个问题戳中了C语言里数组和指针最容易混淆的点,咱们把底层逻辑掰碎了说:

首先先看你的代码和报错:

#include<stdio.h> 
int main(){ 
    int a[] = {1,2,3}; 
    int b[] = {4,5,6}; 
    b = a; 
    return 0; 
}

编译报错:array type 'int [3]' is not assignable

核心原因1:数组名不是可修改的指针变量

你觉得“让b指向a的地址”是修改指针,但这里的b根本不是指针——它是数组类型的标识符,代表的是一块编译期就固定好的、大小为3*sizeof(int)的连续内存区域。虽然在很多表达式里(比如a[0]或者printf("%p", a)),数组名会临时转换成指向第一个元素的指针,但这只是“语法糖”,数组本身的本质是固定内存块,它的地址是不能被修改的,就像你不能给一个常量赋值一样。

核心原因2:类型不匹配,赋值逻辑有歧义

b的类型是int[3](长度为3的int数组),而a转换后的指针类型是int*,这俩类型完全不兼容。退一步说,就算编译器允许这么写,到底是要把a的整个数组内容拷贝到b的内存里?还是让b指向a的地址?这两种操作的语义完全不同,C语言作为一门“底层、明确”的语言,不会给你留这种歧义的空间。

怎么实现你想要的效果?

如果你的目标是让一个指针指向a的地址,那应该定义指针变量:

#include<stdio.h> 
int main(){ 
    int a[] = {1,2,3}; 
    int *b = a; // 这里b是可修改的指针变量,指向a的首地址
    return 0; 
}

如果你的目标是把a的内容拷贝到b的内存里,那得用memcpy或者循环赋值:

#include<stdio.h> 
#include<string.h> // 要包含memcpy的头文件
int main(){ 
    int a[] = {1,2,3}; 
    int b[] = {4,5,6}; 
    memcpy(b, a, sizeof(a)); // 把a的整个内容拷贝到b
    // 或者用循环:
    // for(int i=0; i<3; i++) b[i] = a[i];
    return 0; 
}

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:18:11