12.C语言——结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

目录

结构体类型的声明

结构体声明基本格式

用typedef对结构体进行声明

结构体不完全声明

结构的自引用

结构体变量定义及初始化


结构体类型的声明

结构体声明基本格式

struct tag        //定义结构体名
{
    member-list;  //定义结构体成员
}var-list;        //定义变量名

注意:不管定不定义变量名,结构体末尾的分号都不可省略! 

例如描述一个学生的基本信息:

struct stu1  //stu 为自定义的结构体名称
{
  char name[10];
  int age;
  int score[3];  
}p1,*pf;        //在声明结构体时定义了结构体p1,结构体指针pf

struct stu2   
{
  char name[10];
  int age;
  int score[3];  
};          //也可以选择不进行变量声明

上述例子中定义了一个名为stu的结构体,stu中包含name、age以及score三种信息。

  • 第一个写法是在声明结构体时,创建了一个结构体stu的变量p1和结构体stu的指针pf。
  • 第二个写法则是只声明结构体,不创建变量。
  • 二者的区别在于变量的生命周期不一致,前者创建的变量与stu1的生命周期一致,如果stu1包含在头文件中,那么变量的生命周期也会贯穿程序的始末;后者的生命周期则根据其所处的位置而定。

关于结构体的使用及初始化后文会进行讲解。

用typedef对结构体进行声明

typedef可以对类型进行重定义,方便日后的代码简化及修改工作,例如:

typedef int Datatype;//将int重定义为Datatype
Datatype x;

 结构体的typedef的用法也是如此,不过需要注意一些细节,看下面这个例子:

typedef struct student  
{
  char name[10];
  int age;
  int score[3];  
}stu,*pf;

 这里的等价关系为:

  • struct student x; = stu x;
  • struct student* px; = pf px;(x为自定义的变量名)

结构体不完全声明

在声明结构体时,可以进行不完全的声明,即:在声明时省略结构体名称(tag),而以这种方式声明的结构体由于没有标签,只能使用一次。

//匿名结构体类型
struct
{
 int a;
 char b;
 double c; 
}tmp;

结构的自引用

结构体可以包含结构体自身的指针:

struct Node
{
 int data;
 struct Node* next;
};

在后续学习数据结构中的链表时,就会使用上以上这种写法。 

需要注意的是,如果使用typedef对结构体进行重定义,以下这种写法是错误的:

typedef struct Node
{
 int data;
 Node* next;//这种写法是错误的!
 pNode next;//错误的!
 *pNode next;//也是错误的!
}Node,*pNode;

在C语言中程序是从上往下,从左往右读的,声明tpyedef的变量名在声明结构体成员之后,以上写法自然就是错误的了,当然在C++中会有类似的写法,那就是后续需要学习的了。

结构体变量定义及初始化

在前文讲解了结构体如何声明,接下来介绍结构体如何进行变量的定义及初始化。

结构体定义变量有两种方法:

1.声明结构体时定义变量:

struct test
	{
		int x;
		int y;
	}p1,p2; //声明类型的同时定义变量p1,p2

2.利用结构体类型定义变量:

struct test
	{
		int x;
		int y;
	}
struct test p1;

结构体初始化: 

结构体变量的初始化与数组有些类似,即在定义变量时可以对全部结构体成员进行初始化赋值,而定义变量后只能通过下标访问指定成员进行赋值。

初始化: 

struct test
	{
		int x;
		int y;
	}p1={0}, p2={1,2}; 
	struct test p3 = { 1,2 };//定义变量时直接初始化
  

访问下标:

struct test
	{
		int x;
		int y;
	}p1;
	struct test* p2;//创建结构体指针p2
	p1.x = 1;
	p2->x = 1;

 其中“ . ”就是访问结构体成员的操作,而当对象为结构体指针时,则采用“ -> ”对结构体进行访问。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是元笙阿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值