typedef(类型重命名)
程序员有时候在写某个类型时,对应的那个类型比较长,也比较难记,此时就可以给该类型起个别名 例如:无符号短整形 unsigned short int--->uint16
#include<myhead.h>int main(int argc, const char *argv[])
{//使用类型定义变量: 类型名 变量名;int int_data; //定义了一个整形变量int int_arr[5]; //定义了一个整形数组int *int_ptr; //定义了一个整形指针变量int **int_ptr_ptr; //定义二级指针变量int *int_ptr_arr[5]; //定义了一个指针数组int (*int_arr_ptr)[5]; //定义了一个数组指针int (*fun_ptr)(); //定义了一个函数指针int (*fun_ptr_arr[5])(); //定义了一个函数指针数组struct Test{int num;double score;}Stu; //定义了一个结构体变量//提取上面的类型int ; //整形int [5]; //一个整形数组类型int *; //一个整形指针类型int **; //二级指针类型int *[5]; //一个指针数组类型int (*)[5]; //一个数组指针类型int (*)(); //一个函数指针类型int (*[5])(); //一个函数指针数组类型struct Test{int num;double score;}; //结构体类型//将上面的类型进行重命名typedef int int_data; //定义了一个整形类型typedef int int_arr[5]; //定义了一个整形数组类型typedef int *int_ptr; //定义了一个整形指针类型typedef int **int_ptr_ptr; //定义二级指针类型typedef int *int_ptr_arr[5]; //定义了一个指针数组类型typedef int (*int_arr_ptr)[5]; //定义了一个数组指针类型typedef int (*fun_ptr)(); //定义了一个函数指针类型typedef int (*fun_ptr_arr[5])(); //定义了一个函数指针数组类型typedef struct Test{int num;double score;}Stu; //定义了一个结构体类型return 0;
}
#include<myhead.h>//将无符号短整形重新起个别名
typedef unsigned short int uint16; //将数组类型进行重命名
typedef int int_arr[5];//给函数指针类型重命名
typedef int (*fun_ptr)();//定义一个函数
int demo()
{printf("hello a\n");return 0;
}int main(int argc, const char *argv[])
{uint16 num = 520; //unsigned short int num = 520;printf("num=%hu, sizeof(num)=%zd\n", num, sizeof(num));int_arr arr; //此时arr就是长度为5的整形数组,arr就是数组名printf("sizeof(arr) = %zd\n", sizeof(arr)); //20printf("数组元素分别是:");for(int i=0; i<5; i++){printf("%d\t", arr[i]);}printf("\n");//使用函数指针类型定义变量fun_ptr ptr = demo; printf("sizeof(ptr) = %zd\n", sizeof(ptr)); //8ptr(); //使用函数指针变量调用函数return 0;
}
#include<myhead.h>typedef int *ptr, num; //ptr是int*的重命名 num是int的重命名typedef struct TT
{int num;char name[20];
}Stu, *Stu_ptr;int main(int argc, const char *argv[])
{printf("sizeof(ptr) = %zd, sizeof(num) = %zd\n", sizeof(ptr), sizeof(num));Stu s = {1001, "张三"}; //使用结构体类型定义变量//struct TT s = {1001, "张三"};Stu_ptr ptr = &s; //使用结构体指针类型定义变量//struct TT *ptr = &s;//Stu *ptr = &s;printf("s.num = %d, ptr->name = %s\n", s.num, ptr->name);return 0;
}
typedef和#define的区别
1。typedef是类型重命名语句,必须以分号结尾,而#define是预处理指令,必须以#开头
2.使用这两个重命名一个类型时,几乎没有区别,主要区别在于命名两个类型时。
#include<myhead.h>#define INT int //宏定义
typedef int int32; //类型重命名typedef char *PP; //给double* 重命名
#define FF char * //宏定义int main(int argc, const char *argv[])
{INT num = 520; //?printf("num = %d, sizeof(num) = %zd\n", num, sizeof(num));int32 key = 1314; //?printf("key = %d, sizeof(key) = %zd\n", key, sizeof(key));//使用宏定义变量FF a, b; //char *a,b; a是指针类型 b是普通类型//使用类型重命名定义变量PP m,n; //m和n都是指针类型printf("sizeof(a)=%zd,sizeof(b)=%zd,sizeof(m)=%zd,sizeof(n)=%zd\n", \sizeof(a), sizeof(b), sizeof(m), sizeof(n));return 0;
}
union(共用体)
1.共用体是由相同数据类型或不同数据类型构成的变量的集合,多个成员分享一块内存空间。属于构造数据类型
2.定义格式
union 共用体名
{成员类型1 成员变量1;成员类型2 成员变量2;。。。成员类型n 成员变量n;
};
3.使用方式与结构体一致
4.共用体的多个成员,只占用所占内存最多的那个成员的空间,同时也是共用体变量的大小
5.共用体的每个成员的起始地址都跟共用体变量的起始地址一致
6.共用体一般不能当作函数的形参
7.共用体变量也可以初始化,初始化值用花括号括起来,但是,只能初始化一个值

使用共用体判断当前主机大小端问题
union data
{int num ; //整形成员char key; //字符成员
};int main(int argc, const char *argv[])
{//使用共用体定义变量union data temp;//给整形成员进行赋值temp.num = 0x12345678;//使用其字符数据//temp.key //?if(temp.key==0x12){printf("大端存储\n");}else if(temp.key==0x78){printf("小端存储\n");}return 0;
}
enum(枚举)
1.枚举是解决C语言中的“魔鬼数字”(看不懂的数字)
#ff1200--->rgb(红色)
2.C语言可以给某些类数字进行命名的 例如颜色
3.枚举中的每个值,都是一个数字,整形数字
4.枚举的定义格式
enum 枚举名
{名称1 数字1,名称2 数字2,。。。名称n 数字n;
} //此处不需要加分号
举个例子:
enum Color
{red = 10,//如果不赋值默认从0开始orange 11,yellow 12,green 13,cyan 14,blue 15,puple 16};
C语言中的关键字总结

数据结构
1.数据结构主要研究的是程序在运行过程中,数据的临时容器的问题
该容器仅仅只在程序运行时,短暂的保存数据,以便于程序能够快速处理数据
保存数据-->提供内存空间(数据容器)
处理数据-->对容器提供算法(增删改查)
2.数据结构是一种思想,并不局限于某个编程语言
3.数据结构分为两部分:数据、结构
4.主要注重逻辑思维,画图分析
数据的概念
数值数据:如整数、小数、字符数据
非数值数据:图片、视频、音频
数据元素:能够完整描述某一事物的数据的基本单位
例如:一个学生的完整信息:姓名、学号、性别、分数
数据项:用于组成数据元素的不可分割的最小单位
例如:一个学生信息的某一项
数据对象:由多个数据元素构成,用于研究的一个整体。
例如:一个班级的整体学生信息,就是一个数据对象
多个数据项组成数据元素->多个数据元素组成数据对象->多个数据对象组成数据
数据结构中,是以数据元素为单位进行研究数据的
结构的概念
1.数据元素与数据元素的关系(关联情况)
2.根据关联情况,将结构分为两类:存储结构、逻辑结构
逻辑结构
1.逻辑结构:就是数据元素和数据元素之间的关联情况,根据不同的关联情况,分为四种逻辑结构:
集合结构、线性结构、树形结构、图形结构
2.集合结构:数据元素之间没有任何关联情况,仅仅只是在同一个集合中。
例如一个篮子里的多个水果
3.线性结构:数据元素与数据元素之间存在一对一的关系
例如:排队做核酸,一个弹夹中的所有子弹
4.树形结构:数据元素和数据元素之间存在一对多的关系‘
例如:族谱、公司组织构架
5.图形结构:数据元素之间存在多对多的关系
例如:朋友关系
存储结构
1.所谓存储结构,就是逻辑结构在计算机物理内存上的存储方式(映射)也分为四种结构
顺序存储、链式存储、索引存储、散列存储(哈希存储)
2.顺序存储:使用一段连续的物理内存存储数据元素。特点:逻辑上相邻,物理内存上也相邻
3.链式存储:已用一段不一定连续的存储空间存储数据元素。逻辑上相邻,物理上不一定相邻
4.索引存储:在存储数据元素后,附加一张索引表,标识每个数据元素所在的物理内存位置(书的目录)
5.散列存储:存储数据的物理地址跟数据元素的关键字相关
线性表
1.所谓线性表就是用多个相同特征元素组成的线性结构
相同特征:表示每个数据元素类型一致
线性结构:数据元素之间存在一对一的关系
2.线性表的特点:在线性表中,除了第一个元素没有前驱最后一个元素没有后继外,其余每个元素有且仅有一个前驱一个后继
前驱:当前元素前面那个元素称为该元素的前驱
后继:当前元素后面那个元素称为该元素的后继
分类
按照存储方式:
顺序表:顺序存储的线性表,使用一段连续的存储空间来存储该线性表
链表:链式存储的线性表,使用不一定连续的内存空间来存储该线性表
按受限方式:
栈:其插入和删除操作只允许在同一端进行的线性表
队列:要求其插入和删除操作在不同端进行的线性表
顺序表
顺序存储的线性表
如何解决顺序存储?
1.可以使用数组
2.可以在堆区申请一段空间
如何解决顺序表的元素个数
引入一个变量,记录顺序表的长度


