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

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

 

 

在C语言中,将结构体(struct)中数组的数据赋值给非结构体(即普通数组)的过程需要一些步骤。首先,你需要了解结构体数组的基本概念。 结构体是一种自定义的数据类型,它可以包含多个同类型的成员(通常是变量)。数组是一种数据结构,它存储一组相同类型的数据项。 假设你有一个结构体类型 `struct_type`,它有一个数组 `array`,并且你想将这个数组的数据赋值给一个普通的数组 `normal_array`。 下面是如何操作的步骤: 1. **定义结构体数组**:首先,你需要定义结构体类型和相应的数组。 ```c typedef struct { int id; char name[50]; int age; int numbers[5]; } struct_type; struct_type array[10]; // 结构体数组 ``` 2. **初始化结构体数组**:你可以使用一个循环来初始化结构体数组。注意,对于包含数组结构体,需要按照数组的大小逐个初始化元素。 ```c for (int i = 0; i < 10; i++) { array[i].id = i + 1; // 为每个元素设置id strcpy(array[i].name, "Name" + i); // 为每个元素设置name array[i].age = 25 + i; // 为每个元素设置age for (int j = 0; j < 5; j++) { array[i].numbers[j] = i * j + j + 1; // 为每个元素的numbers数组设置数据 } } ``` 3. **将结构体数组的值复制到普通数组**:接下来,你可以使用逐元素的复制方式将结构体数组的值复制到普通数组中。但是请注意,普通数组的元素大小可能同,因此需要使用循环和类型转换来确保正确复制数据。 ```c int normal_array[10]; // 普通数组 for (int i = 0; i < 10; i++) { for (int j = 0; j < sizeof(struct_type) / sizeof(int); j++) { // 注意这将struct_type转换为int类型来计算元素的数量 normal_array[i] = array[i].array[j]; // 将结构体中的数据复制到普通数组中 } } ``` 现在,`normal_array` 数组中的每个元素应该与 `array` 结构体数组中的对应元素具有相同的数据值。请注意,这种方法假设普通数组的大小足以容纳结构体中的所有数据。如果普通数组的大小足以容纳所有数据,那么可能会出现溢出或数据丢失的问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式园姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值