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;
对于上面的赋值语句,编译器会报错:对数组类型的表达式赋值,即不能对数组类型变量赋值 。
那么编译器此时是如何解释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/C语言愿意的话,直接给数组赋值是“有可能”的(就是语法标准要修改) 。但是,在权衡了各种方案的利弊之后,标准委员会做出了现在的规定,这是权衡各种考虑因素的结果 。
也就是说,目前标准中数组运算的优点大于缺点 。
既然标准已经这样制定了,那我们就来分析一下编译器是如何遵循和实现这个标准的 。
1.数组和指针之间的模糊关系很多人都记得数组名是指向数组起始地址的指针 。这是错误的,或者说不严谨的 。
在C/C中,数组是数组,指针是指针 。数组中有确定的空个空格(每个元素的大小x元素的个数) 。
只不过在表达式中,数组名会“临时的”表示数组中第一个元素的常量指针(前提条件:在没有操作符 sizeof 和

    推荐阅读