昨日回顾
函数定义:
自定义不能嵌套自定义!!
函数名不能与系统函数重名!!
函数声明:
函数调用
递归调用一定要有结束条件,否则会一直递归!!
函数的返回值
函数指针
指针函数
======================================================
一、复杂数据类型
结构体、联合体、枚举类型
1.结构体
可以存储复杂的数据类型,多种,嵌套定义。
基本定义:
struct 结构名
{
//成员列表
};
成员列表:由基本数据类型定义的变量或者是构造类型的变量。
例:
struct student
{
int grade;
int age;
char name[32];
}
student:结构体名称。
struct student:结构数据类型,相当于int,double,char等基本数据类型。
例:
struct student stu;
stu:结构体变量。
访问成员运算符:"."
访问结构体成员
stu.name;
stu.age;
stu.grade;
2.结构体变量的初始化
struct student
{
char name[32];
char sexuality;
int age;
};
(1)初始化1
struct student boy;
strcpy(boy.name,"jack");
boy.age = 24;
boy.sexuality = 'm';
(2)初始化2
struct student girl = {"lisa",'f',22};
(3)初始化3,声明结构体时,定义结构体变量
不建议一下写法
struct student
{
char name[32];
char sexuality;
int age;
}stu,stu1;
struct student
{
char name[32];
char sexuality;
int age;
}stu1={"xiaoming",'m',23};
3.嵌套定义结构体
struct student //struct大小不固定,相当于递归死循环,无法分配空间,故不允许。
{
int a;
char b;
struct student stu;
};
struct student
{
int a;
char b;
struct student *ps; //指针的字节数固定为8,已做限定。故允许。
};
4.无名结构体
struct
{
char name[32];
char sexuality;
int age;
}stu;
无名结构体一般不使用!!
5.宏定义结构体
struct student
{
char name[32];
char sexuality;
int age;
};
#define STU struct student
STU stu;
6.结构体的嵌套
struct date
{
int year;
int month;
int day;
};
struct student
{
char name[32];
int age;
struct date birthday
};
7.结构体数组
结构体数值初始化
struct student arr[3] =
{
{"Lidia",23},
{"Wilheim",20},
{"Peter",21}
};
8.结构体指针
struct date
{
int year;
int month;
int day;
};
struct date *pa;
struct student *pb
指针访问运算符:"->"
#include<stdlib.h>
malloc(); //申请堆空间
free(); //释放空间
pa = (struct date *)malloc(sizeof(struct date));//申请一块堆空间,大小为sizeof(struct date)
free(pa); //申请释放堆空间。
9.typedef
重新取名 typedef int I,即给int取别名为I;
结构体
typedef struct student
{
char name[32];
int age;
}STU;
STU stu ---->
和宏定义的区别
typedef struct student* STT;
#define STD struct student*
10.结构体大小
与内存对齐
Linux 4字节
Windows 8字节
默认从偏移量为0的位置开始存储
每个成员所占字节数是其自身大小的整数倍。
11.联合体
union untype
{
int a;
long b;
char arr[];
};
特点:联合体只能操作,即赋值和访问一个成员变量。
分配空间:按最大数据类型分配空间
12.枚举类型
enum entype
{
A, //0
B, //1
C = 12,
D, //13
E, //14
F = 3,
G //4
};
一般大写字母
第一个值默认为0
从中间赋值起,后面每个默认+1
可以在返回值里应用。
13.链表
链式存储结构,线性存储结构,其大小可动态改变,是由一个个结点串起来的数据了。
结点,由数据域和指针域组成,在内存中是动态随机的。
数据域:存放数据。
指针域:存放下一个结点的地址。
(1)创建链表,先创建结构体的头结点
struct student
{
int id;
struct student *next;
};
struct student *head;
malloc();
free();
创建一个头结点:
struct student *head;
head = (struct student *)malloc(sizeof(struct student));
头结点标识一个链表,即链表名称。其数据域不存数据,指针域存放第一个结点的地址,头结点只是为了标识这个链表。
排版12分钟。