加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

为什么结构体中的数组却可以?

发布时间:2021-04-18 13:13:59 所属栏目:传媒 来源:互联网
导读:对数组类型的变量进行赋值,只能寻求其他的替代方式,例如: 利用 memcpy(b, a, sizeof(int) * 5); 复制一整段内存空间中的内容; 利用 for/while 等循环语句,逐个复制数组中每一个元素: b[i] = a[i]; 三、语言标准和编译器 C/C++ 只是一门高级语言,是被标

对数组类型的变量进行赋值,只能寻求其他的替代方式,例如:

  1. 利用 memcpy(b, a, sizeof(int) * 5); 复制一整段内存空间中的内容;
  2. 利用 for/while 等循环语句,逐个复制数组中每一个元素: b[i] = a[i];

三、语言标准和编译器

C/C++ 只是一门高级语言,是被标准委员会从无到有设计出来的,因此我们编程时需要严格遵守这些规则。

这些规则中,就包括这么一条:只有标量和结构体,才能出现在赋值操作符=的左侧。

但是数组类型并不是一个标量,因此不能对结构体执行赋值操作。

理论上,如果 C/C++ 语言愿意的话,是"可以"对数组直接赋值的(那就要修改语法标准),只不过标准委员会在经过各种场景的权衡利弊之后,做出了目前这样的规定,这是对各种考虑到的因素进行权衡之后的结果。

也就是说,目前标准中对于数组操作的方式,是利大于弊。

既然标准已经是制定成这样的了,我们就来分析一下编译器是如何来遵循、实现这个标准的。

1. 数组与指针的暧昧关系

很多人都这样记忆:数组名就是数组开始地址的指针。这是不对的,或者说不严谨的。

在 C/C++ 中,数组就是数组,指针就是指针。数组在内存中有确定的空间(每个元素的大小 x 元素个数)。

只不过在表达式中,数组名会“临时的”表示数组中第一个元素的常量指针(前提条件:在没有操作符 sizeof 和 & 的情况下)。

对于下面这段代码,打印结果是相同的:

一个 printf 中,a 会“临时的”代表指向第一个元素的常量指针。

第二个 printf 中,a 就表示一个数组,与指针没有半毛钱的关系,前面加上取地址符 &,就表示获取这个数组所在的地址,这个地址与第一个元素的地址是重合的。

注意:代码在被编译成二进制文件之后,没有任何变量的概念,全部是用地址来“传递” C/C++ 代码中的变量。

2. 为什么不能对数组变量赋值

有了上面的基础理解就好办了,对于下面的这段代码:赋值语句 b = a 中,左侧的 b 是一个数组类型,右侧的 a 被编译器“临时的”代表第一个元素的常量指针,但是数组不是一个标量,不可以放在赋值运算符=的左侧,因此编译器就抱怨:非法!

既然在一个表达式中,数组名被临时的表示第一个元素的常量指针,那么就说明我们不能对数组名本身进行计算,例如:不能进行 a++, a-- 等操作。

例如:下面这的遍历方式是非法的:

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读