现象:
数组的整体赋值
int a[3] = {1,2,3};
int b[3];
b = a;
报错:
结构体的整体赋值
struct BOOK
{
int id;
char name[20];
};
struct BOOK a = {3,"活着"};
struct BOOK b = a;
printf("%d-%s\n",b.id,b.name);
;
结构体的整体赋值,相当于将a中成员的值赋值给b中对应的成员,b中成员影响a中成员的值。
#include<stdio.h>
struct BOOK
{
int id;
char name[20];
};
int main()
{
struct BOOK a = {3,"活着"};
struct BOOK b = a;
b.id = 5;
printf("%d-%s\n",a.id,a.name);
printf("%d-%s\n",b.id,b.name);
return 0;
}
因为a中成员空间的分配是发生在声明结构体变量a的时候,b中成员空间的分配是发生在声明结构体变量b的时候。两个变量的成员具有自己的内存空间,互不影响。
解释:
数组名是数组首元素的地址,而b的数据类型是 int [3],而数组名a是一个地址,数据类型为int *,因此赋值的时候两边数据类型不一致,又转化不了,因此报错。
结构体变量的名称是结构体空间的名称,是变量,不是地址常量,因此可以赋值。同理,结构体中的成员如果是数组,也不能整体赋值,如果是字符串可以使用strcpy,如果是数组则需要循环赋值。
拓展:
数组不可以整体赋值但是指针可以,结构体可以,基础数据类型也可以。
#include<stdio.h>
struct BOOK
{
int id;
char *name;
};
int main()
{
struct BOOK a = {3,"活着"};
struct BOOK b = a;
b.id = 5;
b.name="西游记"; //如果结构体中name声明为char name[20];则整体赋值会报错
printf("%d-%s\n",a.id,a.name);
printf("%d-%s\n",b.id,b.name);
return 0;
}
但是指针指向的数据只能整体修改,不能部分修改,但是数组可以部分修改。