C语言语法基础十——结构体、共用体和用户定义类型
/本章主要介绍: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");
}
Name | Number | Sex | Age | |
---|---|---|---|---|
student[0] | 小明 | 2018211 | 男 | 20 |
student[1] | 小张 | 2018212 | 男 | 18 |
student[2] | 小王 | 2018213 | 女 | 20 |
11.2.5 结构体指针
定义:结构体类型.*指针名
访问结构体变量成员:
- (*pStruct).成员名 //1.使用点运算符引用【!注意一定要加括号,因为.运算符优先级最高】
- 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结构体作为函数参数
void Display(struct Student stu);
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. 不能对共用体变量名赋值, 也不能企图引用变量名来得到一个值。