[C语言]为什么数组不可以整体赋值而结构体可以

现象:

数组的整体赋值

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;
}

但是指针指向的数据只能整体修改,不能部分修改,但是数组可以部分修改。

 

 


版权声明:本文为amyliyanice原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。