c语言指针给数组输入赋值 数组如何赋值


c语言指针给数组输入赋值 数组如何赋值

文章插图
c语言指针给数组输入赋值 数组如何赋值

文章插图
  • 一、前言
  • 二、数组的各种操作
    • 1. 错误方式
    • 2. 利用结构体来复制数组
    • 3. 其他复制方式
  • 三、语言标准和编译器
    • 1. 数组和指针的关系
    • 2. 为什么不能对数组赋值
    • 3. 函数形参是数组的情况
    • 4. 为什么结构体中的数组可以复制
    • 5. 参数传递和返回值
  • 五、总结
一、前言在 C/C语言中,数组类型的变量是不可以直接赋值的 。但是如果把数组放在结构体中,然后对结构体变量进行赋值,就可以实现把其中的数组内容进行复制过去 。
很多朋友对这个不是特别理解,只是强制记忆,下面我尝试用自己的理解来描述一下,希望对你有所帮助!
二、数组的各种操作1. 错误代码int a[5] = {1, 2, 3, 4, 5};int b[5];b = a;对于上面的赋值语句,编译器会报错 error: assignment to expression with array type,即:不能对一个数组类型的变量进行赋值 。
那么编译器此时是如何来解释 a 和 b 的?下面会说到这个问题 。
有一个地方提一下:第一条语句中的 = 操作,不是赋值,而是初始化 。C/C语法规定在定义变量的时候,是可以使用 操作符 = 来进行初始化操作的 。
2. 利用结构体来复制数组typedef struct {int arr[5];} array_wrap;array_wrap a = {{1, 2, 3, 4, 5}};array_wrap b;b = a;这里的赋值操作是针对结构体变量,C 语言标准允许这种行为,是合法的,变量 a 中的所有内容(也就是这个变量占用过的那一块内存空间中的内容)会原样的复制到变量 b 中 。
3. 其他复制方式既然不能直接对数组类型的变量进行赋值,只能寻求其他的替代方式,例如:
利用 memcpy(b, a, sizeof(int) * 5); 复制一整段内存空间中的内容;
利用 for/while 等循环语句,逐个复制数组中每一个元素: b[i] = a[i];
三、语言标准和编译器C/C只是一门高级语言,是被标准委员会从无到有设计出来的,因此我们编程时需要严格遵守这些规则 。
这些规则中,就包括这么一条:只有标量和结构体,才能出现在赋值操作符=的左侧 。
但是数组类型并不是一个标量,因此不能对结构体执行赋值操作 。
理论上,如果 C/C语言愿意的话,是"可以"对数组直接赋值的(那就要修改语法标准),只不过标准委员会在经过各种场景的权衡利弊之后,做出了目前这样的规定,这是对各种考虑到的因素进行权衡之后的结果 。
也就是说,目前标准中对于数组操作的方式,是利大于弊 。
既然标准已经是制定成这样的了,我们就来分析一下编译器是如何来遵循、实现这个标准的 。
1. 数组与指针的暧昧关系很多人都这样记忆:数组名就是数组开始地址的指针 。这是不对的,或者说不严谨的 。
在 C/C中,数组就是数组,指针就是指针 。数组在内存中有确定的空间(每个元素的大小 x 元素个数) 。
【c语言指针给数组输入赋值 数组如何赋值】只不过在表达式中,数组名会“临时的”表示数组中第一个元素的常量指针(前提条件:在没有操作符 sizeof 和

    推荐阅读