C语言程序设计学习笔记--用户建立数据类型。
9.1定义和使用结构体变量
1.定义:C语言允许用户自己建立不同类型数据组合成的组合型数据类型就是结构体
2.形式: struct 结构体名
{ 成员表列
类型名 成员名 ; } ; //成员可以属于另一结构体类型
3.定义结构体类型变量
(1)先 声明结构体类型 后 定义该类型变量
Struct studentstu1 ,stu2 ;
(2)在声明类型的同时 定义变量
例如:
Struct student
{ int xx;
char ; }stu1, stu2;
4.变量的初始化和引用
(1)运算符 “ . ” 优先级 MAX
? 示例:sturuct student 1= { .name = “gao bo” } ; // . name 代表结构体变量中 1中
成员1.name。其他的未指定的初始化为0,字符-‘\0’,指针-‘NULL’。
? 示例: 结构体变量名 . 成员名
Student . num//可以引用结构体变量的成员的值,
? 示例: 可以进行各种运算
Student1.score=student2.score
? 示例:
Student 1 = Student 2 //同类型结构体变量可以互相赋值
? 示例: 结构体变量成员,结构体变量的地址可以引用
Scanf(“%d”,&student1.num); //输入&student .num
Printf(“%o”,&student1); //输出首地址
代码:
#include
int main()
{
structStudent
{
int num;
char name[20];
float score;
}stu1,stu2;
scanf("%d %s %f",&stu1.num,stu1.name,&stu1.score );
scanf("%d %s %f",&stu2.num,stu2.name,&stu2.score );
printf("the max is") ;
if(stu1.score > stu2.score)
{
printf(" %d %s%f",stu1.num,stu1.name ,stu1.score );
}
elseif (stu1.score < stu2.score)
{
printf(" %d %s%f",stu2.num,stu2.name,stu2.score);
}
else
{
printf("%d %s%f",stu1.num,stu1.name ,stu1.score );
printf(" %d %s %f",stu2.num,stu2.name,stu2.score);
}
return 0;
}
9.2结构体数组
1. 定义: struct 结构体名
{成员表} 数组名【数组长度】;
2.初始化:
数组 = {初始化表}
StructStudent stu [3]={ “ ” , ” ” ,” ” }
9.3结构体指针
1.指向结构体变量的指针
? 指向结构体变量;
? 指向运算符“ ->”
示例: p->number ==== (*p).numberp指向结构体中number成员
? 指向结构体数组中得元素//类型必须相同
示例:
structstudent *p1 //p1可以指向struct student类型的变量或数组元素
3.指向结构体数组的指针
? 结构体数组在内存中连续存放。
4.用结构体变量和其指针作函数参数
结构体变量的值传递给另一个参数,三种方法:
(1)用结构体变量的成员作为参数
(2)用结构体变量作为实参
(3)指向结构体变量的指针作为实参,将变量地址传给形参
9.4用指针处理链表
1.链表:动态进行存储分配的一种结构。
结点:
? 用户需要的实际数据
? 指向下一个节点的地址(指针变量存放)
Struct Student
{
Int num;
Int score ;
Struct Student * next ; //next 指针变量,指向结构体变量
}
2.静态链表:所有节点在程序中定义,不是临时开开辟,也不能用完后释放
3.动态链表:结点一个个开辟,并建立起前后相链接的关系。
9.5共用体类型
1.定义:
几个不同的辩论共享一段内存的结构,成为“共用体”类型的结构。
2.一般形式:
Union 共用体名 union data
{ {
成员表列 int i ; char ch; float f;
}变量表列; }a,b,c//定义变量
3.区别
? 结构体变量:内存长度是各个成员内存长度之和,每个成员分别占有自己的内存单元。
? 共用体变量:内存长度等于最长的成员的长度
5.引用
? 不能引用公园提变量,只能引用共用体变量中的成员。
举例: a.i a.cha.f
6.注意
(1)每一次只能存放其中一个成员,而不是同时存放几个
(2)可以用共用体变量初始化,但是初始化表中只能由一个常量。
(3)最后一次被赋值的成员取代原有的
(4)地址与其各个成员同一个地址 &a.i &a.ch,&a.f
(5)不能对变量名赋值,也不能通过引用变量名得到一个值
9.6使用枚举类型
1.定义:
一个变量值有几种可能的值,所谓枚举“把可能的值一一举例‘。
2.一般形式:
enum [ 枚举名 ] { 枚举元素列表 };
enum Student { name, number, score};
3.注意:
(1)C编译对枚举类型的枚举元素按照常量处理 ,成为枚举常量。
(2)每一个枚举元素代表一个整数,根据顺序默认值为0,1,2,3,4
也可以人为制定 enumstudent{num1=8,num2=9.num3=6}number,
(3)枚举元素可以判断比较
9.7用typdef声明新类型名
1.用一个新的类型名代替原有类型名
? typedef 的作用——可以用typedef声明新的类型名来代替已有的类型名。
? 声明方式:typedef 类型名称 新的类型名称。
示例:
Typedef int integer ; //指定用integer为类型名。作用与int相同
IntI , j ; 等价于integer I , j;
2.命名一个简单的类型名代替复杂的类型表示方法
(1)新的类型名代表结构体类型
Typedef struct
{
int month;
int day;
int year;
} Date;//新的类型名Date, 可以用其定义变量
Date birthday ; //定义结构体类型变量birthday
Date *p;// 定义结构体变量p,指向其结构体类型数据
(2)命名一个新的类型名代表数组类型
(3)命名一个新的类型代表指针类型
(4)命名一个新的类型名代表指向函数的指针类型
? 总结:按照定义变量的方式,将变量名换成新的类型名,在前面加上typedef,声明了
新类型名代表原来的类型。