C语言语法基础(十)——结构体、共用体和用户定义类型

C语言语法基础十——结构体、共用体和用户定义类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PuRiJQ3L-1594185517551)(C:\Users\17995\AppData\Roaming\Typora\typora-user-images\image-20200704223649781.png)]

/本章主要介绍:C语言中可由用户自己定义的三种数据类型
*1.typedef(用户定义类型):对已有类型,另外说明一个新的类型标识符
*2.struct(结构体):把具有相互关系不同数据类型组成一个有机整体
*3.union(共用体):也称联合体,使几种不同类型变量共用一段储存空间
*/

10.1用typedef定义类型

【定义格式】: **typedef 类型名 新类型名 ** ✎

typedef int INTEGER;             //把用户命名标识符说明成一个int新类型,可替代int来使用
INTEGER i,j;                     //等价于“ int i,j ”

typedef int *IPOINT;              //为指针类型命名
IPOINT ip;                       //相当于“ int *ip ”

typedef char A[8];              //为数组类型命名
A c,d[20];                       //相当于“ char c[8],d[20][8]  ”

10.2 结构体

结构体是一种复杂但灵活的构造数据类型,它由若干个相互关联的不同类型的数据项组成。

在这里插入图片描述

10.2.1 结构体声明

【格式】:
在这里插入图片描述

11.2.2结构体定义
(1).在声明结构体类型时,同时定义
struct Product{
	char cName[10];
	char cShape[20];
}product1,product2;

(2).先声明结构体类型,再定义变量

struct Product p1;
struct Product p2;
//定义结构体变量需要指定为“特定的”结构体类型,如:struct Product

(3).直接定义体类型变量

struct {                    //不需要给出结构体名称
	char cName[10];
	char cShape[20];
}product1,product2;
11.2.3结构体类型初始化
#include<stdio.h>
struct Student {
	char cName[10];
	char cSex[2];
	int iAge;
} s1 = { "韩雪", "w", 20 },                  //声明结构体变量时同时指定初值
s2 = { "林青霞", "w", 20 };

int main() {
	struct Student s3 = {"胡歌","m",22};     //定义结构体变量时设置初值
	struct Student s4;
	/*引用结构体变量*/
	printf("请输入第4名姓名:");
	scanf("%s", &s4.cName);
	printf("请输入第4名的性别:");
	scanf("%s", &s4.cSex);
	s4.iAge = s3.iAge++;                     //结构体变量成员进行运算
	/*输出第4名学生的信息*/
	printf("姓名:%s\n", s4.cName);
	printf("性别:%s\n", s4.cSex);
	printf("年龄:%d\n", s4.iAge);
}

在这里插入图片描述

11.2.4 结构体数组

数组中各数据在内存中的存储是连续的

#include<stdio.h>
/**定义并创建结构体数组*/
struct Student{                
	char cName[20];
	int iNumber;
	char cSex[6];
	int iAge;
}student[3]={
	{ "小明",2018211,"男",20 },
	{ "小张",2018212,"男",18 }, 
	{ "小王",2018213,"女",20 }
};

int main(){
	int i;                   //循环控制
	/**循环输出结构体元素*/
	for (i = 0; i < 3;i++)
	{
		printf("No %d:\n", i + 1);            //输出学生序号
		printf("Name=%s  Number=%d  Sex=%s  Age=%d\n", student[i].cName, student[i].iNumber, student[i].cSex, student[i].iAge);
	}
	printf("*******************************************************\n");
}
NameNumberSexAge
student[0]小明201821120
student[1]小张201821218
student[2]小王201821320
11.2.5 结构体指针
定义:结构体类型.*指针名
访问结构体变量成员:
  1. ​ (*pStruct).成员名 //1.使用点运算符引用【!注意一定要加括号,因为.运算符优先级最高】
  2. ​ pStruct->成员名 //2.使用指向运算符引用结构成员
/*指向结构体数组的*/
#include "stdio.h"
struct Student{
	char sName[10];
	int iNumber;
	char cSex[4];
	int iAge;
}student[3]{
	{ "Jane",2018,"女",18 },
	{ "David",2019,"男",19 },
	{ "张萌", 2020,"女", 20 }
};

int main(){
	struct Student *s;
	int i;
	s = student;
	/*点运算符引用结构成员*/
	printf("Name:%s    Number:%d     Sex:%s    Age:%d\n", (*s).sName, (*s).iNumber, (*s).cSex, (*s).iAge);
	printf("-----------------------------------------------------------------\n");
	for (i = 0; i < 3;i++,s++)
	{
		printf("No%d: ", i+1);                       //输出学生序号
	/*指向运算符引用结构成员*/
		printf("Name:%s    Number:%d     Sex:%s    Age:%d\n", s->sName, s->iNumber, s->cSex, s->iAge);
	}
	printf("\n");
	return 0;
}

在这里插入图片描述

11.2.6结构体的嵌套
#include<stdio.h>
struct date{          //时间信息结构 
	int year;
	int month;
	int day;
}; 
struct student{      //学生信息结构 
	char name[15];
	int num;
	char sex[4];
	struct date birthday;           /*出生日期*/
}student={"坤坤",120612,"男",{1998,8,2}};       //初始化成员变量
int main(){
	printf("***********学生成绩**********\n");
	printf("姓名:%s\n",student.name); 
	printf("学号:%d\n",student.num);
	printf("性别:%s\n",student.sex);
	printf("出生日期:%d,%d,%d\n",student.birthday.year,student.birthday.month,student.birthday.day);
	return 0;
}

在这里插入图片描述

11.2.7结构体作为函数参数
  • 1.使用结构体变量作为函数参数(值传递)
void Display(struct Student stu);
  • 2.使用指向结构体变量的指数作为函数参数(地址传递)
void Dispaly(struct Student *stu)
#include<stdio.h>
//学生信息结构 
struct Student{     
	char cName[10];         
	float fScore[3];                   /*成绩*/              
}stu={"坤坤",98.5f,89.0,93.5f};       /*初始化成员变量*/


//使用结构体变量作函数参数 
void Display(struct Student stu){
	printf("-----------学生成绩-------------\n");
	printf("姓名:%s\n",stu.cName); 
	printf("语文:%.2f\n",stu.fScore[0]); 
	printf("数学:%.2f\n",stu.fScore[1]); 
	printf("英语:%.2f\n",stu.fScore[2]); 
	/*计算平均分数*/
	printf("平均成绩:%.2f\n",(stu.fScore[0]+stu.fScore[1]+stu.fScore[2])/3); 
	printf("\n");
}

//使用结构体变量指针作函数参数
void show(struct Student *s){
	printf("-----------Test02(地址传递)-------------\n");
	printf("英语:%.2f\n",s->fScore[2]); 
	s->fScore[2]=90.5f;
} 

int main(){
	Display(stu);
	struct Student *s=&stu;              /*定义结构体变量指针*/
	show(s);                            /*调用函数,结构体指针变量作为参数传值*/          
	printf("更改后的英语成绩:%.2f\n",s->fScore[2]);
	return 0;
}

在这里插入图片描述

10.3 共用体

/*
*共用体和结构体看起来比较像,关键字是union
*作用:定义一块为所有数据成员共享的内存。 

格式:union 共用体名{
	  		成员列表;
	 }变量列表; 
*/ 

#include<stdio.h>
//声明共用体类型 
union DataUnion{
	int iInt;
	char cChar;
}; 

int main(){
	union DataUnion du;                  /*定义共用体变量*/ 
	du.iInt=97;                          /*为共用体变量成员赋值*/
	printf("iInt:%d\n",du.iInt);         /*输出成员变量数据*/ 
	printf("cChar:%c\n",du.cChar);
	du.cChar='A';                        /*改变成员变量数据*/ 
	printf("iInt:%d\n",du.iInt);
	printf("cChar:%c\n",du.cChar);
	return 0; 
}

在这里插入图片描述

【注意】:

1. 共用体中,只有一个成员起作用,其他成员不起作用。
2. 共用体变量中起作用的成员是最后 一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
3. 共用体变量的地址和它的各成员的地址是一样的。
4. 不能对共用体变量名赋值, 也不能企图引用变量名来得到一个值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值