0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数组名之间可以直接赋值吗

学益得智能硬件 来源:学益得智能硬件 2024-11-26 11:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

数组之间的赋值能不能直接使用等于号?比如这样的代码。

int main()
{
    int a[5] = {1, 2, 3, 4, 5}; 
    int b[5] = {0};


    b = a;
    
return 0;
}

想把数组 a 里面的数据全部赋值给 b,写成 b = a 行不行?

和这个问题类似的还有,数组名为什么不能进行 ++ 操作?

chararray[5]={0};
array++;

比如这样的表达式,array++ 在编译的时候就会提示错误:

root@Turbo:~# gcc test.c -o test
test.c: In function ‘main’:
test.c:18:11: error: assignment to expression with array type
   18 |         b = a;
      |           ^
test.c:22:14: error: lvalue required as increment operand
   22 |         array++;
      |              ^~
root@Turbo:~#

需要一个左值作为操作数,换句话说,数组名不能作为左值。

关于数组名,官方的解释是:

/*
 * Except when it is the operand of the sizeof operator, or typeof 
 * operators, or the unary & operator,or is a string literal used 
 * to initialize an array, an expression that has type "array of 
 * type" is converted to an expression with type "pointer to type" 
 * that points to the initial element of the array object and is not
 * an lvalue. If the array object has register storage class, the be
 * havior is undefined.
 * */

除了跟 sizeof、typeof、& 这些运算符一起使用,数组类型通常被转换成指针类型,指向数组的第一个元素,并且它不能作为左值,不能作为左值,也就是不能被修改。

其实也很好理解,数组被初始化后,已经分配了内存,数组名就表示这块内存的地址,如果数组名被修改了,整个数组都要跟着移动,显然不合适。

那 array + 1 这个表达式有没有问题?

当然没有问题,array++ 和 array + 1 是两码事。

array++ 会修改 array 的值,但是 array + 1 只是个表达式,并不会修改 array 的值,如果写成 array = array + 1 才会出问题。

for (int i = 0; i < 5; i++)
{
    b[i] = a[i];
}


//或者 
memcpy(b, a, sizeof(int) * 5);

最后就是关于数组的赋值,在C语言中没有捷径,只能通过循环逐个元素赋值,数组名不能直接赋值。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73150
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27114

原文标题:数组名之间能否直接赋值

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用直接寻址方式提高速度

    允许编译器生成更高效的代码,因为访问变量时不需要额外的地址计算。这样可以减少指令周期,提高执行速度。直接寻址通常用于内存限制较小的存储区域,如8051微控制器的内部数据存储区(通常为128字节
    发表于 12-04 06:28

    scanf函数介绍

    \",a); 正确 二维数据或多维数组的定义和引用 int a[4,5]; a[1+2,2+2]=5; 错误 int[10]; 正确 误以为数组名代表数组全部元素 int a[4
    发表于 12-02 06:07

    单片机之间可以进行无线数据传输吗

    ) 1. 使用其他无线通信技术:如果单片机之间的距离较近,可以考虑使用如Wi-Fi、蓝牙、ZigBee等短距离无线通信技术进行数据传输。这些技术通常支持设备间的直接通信,但传输距离和速率可能有
    发表于 11-28 08:15

    数组的初体验

    程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组可以数组理解为大小固定,所放物品为同类的一个购物袋,在该购 物
    发表于 11-25 08:06

    智能模块可以和PLC直接连接吗?

    我想读写PLC的状态和数据,用可以直接连接吗?怎么操作呢?
    发表于 10-18 09:40

    两台变频器之间如何直接实现数据交换?

    在现代工业自动化控制系统中,变频器之间的数据交换是实现设备协同工作和智能化控制的关键环节。本文将深入探讨两台变频器之间直接实现数据交换的多种技术方案,分析其工作原理、实施要点和应用场景,为
    的头像 发表于 09-19 18:24 724次阅读
    两台变频器<b class='flag-5'>之间</b>如何<b class='flag-5'>直接</b>实现数据交换?

    罗氏线圈可以直接连接示波器进行测试吗?​

    在电气测量领域,罗氏线圈凭借其非接触测量和宽频响应等优势,已成为电流检测的常用工具。示波器作为信号观测的核心设备,与罗氏线圈搭配使用,能够实现对电流信号的实时监测与分析。那么,罗氏线圈可以直接
    的头像 发表于 09-03 13:55 422次阅读
    罗氏线圈<b class='flag-5'>可以</b><b class='flag-5'>直接</b>连接示波器进行测试吗?​

    matlab appdesigner 表格组件赋值问题,求助

    如上图所示,我在用matlab2021Ra APP模块进行编程的时候,想在表格中调入自己编写的结构数组,我从网上AI了一个程序语句,看着没问题,但是就是给表格赋值不了,还请各位大神帮忙看一下这个是怎么回事,我是初学者,请各位帮忙看看
    发表于 07-12 11:45

    《ESP32S3 Arduino开发指南》第三章 C/C++语言基础

    要访问一个数组中的某个元素,则需要使用以下语句。数组名称[下标] 需要注意的是,数组下标是从0开始编号的。例如,将数组a中的第一个元素赋值
    发表于 06-10 09:20

    光纤头可以直接转换网线头吗

    光纤头不能直接转换网线头,需要通过光电转换设备(如光纤收发器或光电交换机)将光信号转换为网络信号,才能与网线连接。以下是具体分析: 一、光纤与网线的传输特性差异 信号类型不同 光纤传输的是光信号
    的头像 发表于 06-03 10:27 2073次阅读

    【硬件方向】企面试笔试真题:大疆创新校园招聘笔试题

    企面试笔试真题:大疆创新校园招聘笔试题-硬件 是几年前的题目,不过值得参考一下哦 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持一下哦~
    发表于 05-16 17:31

    在testbench中如何使用阻塞赋值和非阻塞赋值

    本文详细阐述了在一个testbench中,应该如何使用阻塞赋值与非阻塞赋值。首先说结论,建议在testbench中,对时钟信号(包括分频时钟)使用阻塞赋值,对其他同步信号使用非阻塞赋值
    的头像 发表于 04-15 09:34 1005次阅读
    在testbench中如何使用阻塞<b class='flag-5'>赋值</b>和非阻塞<b class='flag-5'>赋值</b>

    给uint32_t数组填充整型值,除使用循环赋值外有没有c库函数可以实现?

    给uint32_t数组填充整型值,除使用循环赋值外有没有c库函数可以实现
    发表于 03-07 17:05

    请问LabView中如何直接发送二维数组到DMD上显示?

    LabView中如何直接发送二维数组到DMD上显示。 在LabView中,调用int LoadData(UCHAR*RowData,long length)遇到两个问题,1 二维数组如何输入到
    发表于 02-27 07:30

    数组的下标为什么可以是负数

    a[3],数组名 a 作为数组首元素地址,下标 3 表示从这个地址开始向后移动 3 个元素,至于具体是几个字节,得看什么元素。 所以 a[3] 完全等价于 *(a + 3),甚至把代码写成 3[a] 编译
    的头像 发表于 12-20 11:18 858次阅读