day19 C语言收尾及数据结构
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)); //20
printf("数组元素分别是:");
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)); //8
ptr(); //使用函数指针变量调用函数
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.可以在堆区申请一段空间
如何解决顺序表的元素个数
引入一个变量,记录顺序表的长度
原文地址:https://blog.csdn.net/luochen330x/article/details/144075982
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!