C语言的几种结构体Struct的赋值方法

C语言的几种结构体Struct的赋值方法


1. 定义结构体类型

这里是两个结构体的基本结构。

struct Init{
	int a;
	float b;
	double c;
}I1;
struct SIMPLE{
	int a;
	float b;
	double c;
};
stuct SIMPLE s1;

然而即使两个结构体成员列表全部一样,但是这两者还是被编译器当做完全不同的存在。一个类型是struct Init 一个类型是 struct SIMPLE就相当于int 和float 一样。
结构体中可以包含其他结构体。

  1. 结构体中包含其他结构体类型变量。
struct COMPLEX{
	char string[100];
	struct SIMPLE id1;
};
  1. 结构体中也可以包含指向自己的结构体指针。
struct NODE{
	int nodenum;
	struct NODE *NextNode;
}

NextNode就是指向相同结构体类型中的下一个结构体的首地址,在未定义的情况下NextNode的值一般都是置NULL。这样就有可能无限延伸是不是很神奇。
下面的内容中,需要大家稍微了解下,初始化与普通赋值的区别。
变量的初始化:是指在定义变量的同时就为该变量赋值。
结构体变量在
初始化*时应该用**花括号“{}”**将用来初始化的各个数值括起来,并且各个数值之间要用逗号分隔开来,同时必须保证数值与相应成员变量的类型要一一对应。
对于变量而言,如果已经定义了类型,那么在系统内部已经为该变量开辟了内存空间。
成员变量在结构体变量定义好后,已经置为各自类型的NULL状态,如int a;a默认值为0。
这里有种特殊情况。

直接定义结构体变量。也就是声明一个无名的结构体类型。

无名结构体变量由于省略了结构体类型名,无法记录该结构体类型,所以该方式只能用来声明结构体变量,而且以后也不能用他来声明变量或函数等等。

#include <stdio.h>
struct{
	int a;
	double b;
	char *c;
}idx;

也就是下面的内容中,定义结构体变量之后,初始化定义是无法用的,只可以用成员运算符。

1.1 定义结构体类型时,同时定义结构体变量

在这种情况下赋值成员变量可以是同时进行,也可以是先后进行,就和int a = 1;和int a;a = 1;是一样的道理。但是意义上有些不同
定义结构体变量的同时,初始化结构体变量,相当于int a = 1;
定义结构体变量之后,初始化结构体变量,这在普通变量中是不可以的,因为这就相当于 int a;int a = 1;这样子对普通变量而言就是错误。
定义结构体变量之后,对结构体变量进行非初始化的赋值,相当于 int a;a = 1;

1.1.1 定义结构体变量的同时,初始化结构体变量

#include <stdio.h>
struct Init{
	int a;
	double b;
	char *c;
	float d;
}id1 = {1,2.0,"hello"},id2[2],*id;

赋值之后只是修改了这个成员变量的值,如果赋值只是修改该变量的值,对于地址等内容没有任何影响。

1.1.2 定义结构体变量后,赋值成员变量

#include <stdio.h>
struct Init{
	int a;
	double b;
	char *c;
	float d;
}id2;

这种就是还未经过初始化的结构体成员变量定义。而想要在未经初始化的结构体变量定义之后,对该结构体进行成员变量修改。
形式上有所不同,可以分为以下两种方式。

第一种是有序赋值(初始化定义)。
struct Init id2 = {1,1.1,"hello"};

这样默认float为空。
【注1】这种样式是结构体变量的定义。相当于前面虽然已经定义了结构体变量,但是那某种程度上也是声明,而这里对结构体变量的值以定义的形式进行了初始化。
而这也就意味这样的赋值只能进行一次,如果再次进行就意味着重复定义,如下所示。
在这里插入图片描述
【注2】而且不能将结构体作为一个整体进行输入输出,也就是结构体变量一旦定义完成之后,不能当做被一个单独的变量,进行赋值如下图所示。
在这里插入图片描述
但是可以用下面的成员运算符进行赋值。

第二种是无序赋值,也就是键值对类型。

这种方式利用成员运算符,进行赋值。而这种也是分为结构体内部赋值和结构体外部赋值
这种赋值方式涉及结构体成员的引用。
引用方式为:结构体变量名.成员名。起哄“.”是成员运算符,也称为分量运算符,它在所有运算符中优先级最高。

下面这种是对成员变量赋值。即使是在未经过结构体变量初始化的情况下,也是可以赋值的。

struct Init id2;
id2.a = 1;
id2.c = "world";
id2.d = 1.1;

下面这种则是初始化,也是定义,即利用成员运算符进行初始化,在结构体变量内部,在成员运算符前面加或者不加结构体变量名都是可以的。

struct Init id2 = {
	id2.a = -1,
	.c = "hello",
	.b = 4.0
};

在这里插入图片描述

2. 补充

  • 如果成员本身又属于一个结构体变量类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,并且只能对最低级的成员进行操作。
  • 可以将一个结构体变量直接赋值给另一个具有相同结构的结构体变量。
  • 对成员变量可以像普通变量一样进行各种运算。
  • 可以引用成员的地址,也可以引用结构体变量的地址。结构体变量的地址主要用作函数参数,传递结构体的地址。
  • 33
    点赞
  • 123
    收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 15

打赏作者

从零开始的智障生活

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值