一、数据结构C语言基础
1. 基本数据类型
a. 为什么要定义数据类型?
int:4字节,char:1字节,float:4字节,double:8字节
2. 数组
a. 定义20个int,15个char,10个float,并赋值
一维数组 int a [20] = {};
b. 每类数据分别需要三个怎么定义和赋值?
二维数组 int a [3][10]={{},{},{}};
3. 指针
a. 指针的定义与赋值
int* p;
int x =12;
int* p=&x;
b. 如何取指针变量里面的值
int y=7;
int* q=&y;
printf("%d",*q);
c. 指针与一维数组
4. 结构体
a. 结构体定义方式
b. 定义单链表
5. malloc
申请堆区空间,可修改
6. 输出printf()
int x =6;
float y =6.3;
char z ='&';
printf("%d",x); //输出整数
printf("%f",y); //输出浮点数
printf("%c",z); //输出char
7. 输入scanf()
scanf("%d,%f,%c",&x,&y,&z);
scanf_s();//输入char、int的时候与scanf区别不大,在输入字符串的时候,要限定输入元素的大小值,避免引用到不存在的元素。
8. 运算符
算术运算符中,%取余,/取商
条件运算符中,表达式1?表达式2:表达式3;(判断1,真则执行2,非真则执行3)
二、C语言程序设计(补充)
(1)基础知识
1. 原码反码补码
2. 堆(动态存储区)栈
3. C语言编译过程(预编译、编译、汇编、链接)
a.
.o 二进制代码文件
b. Linux下GCC编译器编译过程
hello_elf 为目标文件名
(2)定义宏、编译
1. define定义宏
a. 不带参的宏
b. 带参的宏
2. 选择性编译
选择性编译都是在预编译阶段完成的
a. #ifdef
b. #ifndef
c. #if
3. 静态库和动态库(linux中gcc编译器)
a. 动态编译和静态编译
b. 静态库文件的制作
c. 动态库文件的制作
(3)指针、字符串、结构体、共用体等
1. 指针与内存
a. 指针的概念
多字节变量int a 的地址为0x00002000(最小的地址)
b. 指针的定义(&取地址,*取值)
int *p,*q; //定义了两个整型指针变量
int *p,q; //定义了一个整型指针变量p和一个整型变量q
c. 指针的分类
补充:C语言中规定,数组的名字就是数组的首地址,即地0个元素的地址,就是&a[0],是个常量。
不能给常量a赋值,可以给指针赋值。
d. 指针的运算
ⅰ. 指针指向数组中的一个元素时,加一个整数n,将指向下第n个元素。
ⅱ. 同类型指向同一个数组元素的指针可以比较大小、做减法(中间隔了几个元素)、赋值
e. 指针的指针
2. 字符串(#pragma warning(disable:4996))
括号中内容可屏蔽visual studio中对scanf等函数的不安全警告
a. 字符串的可修改性
b. 字符串的初始化及赋值
3. 数组的指针(与指针的数组区分)
a. 数组指针的定义
b. 数组名字取地址
c. 数组指针取星号(*)
4. 指针作为函数的返回值
a. 函数执行后str被释放,p为野指针,此种情况无意义
第四行改为
①Static char str[100] = "hello world";//静态局部变量
②char* str = "hello world";//文字常量
③char* str;
str = (char*)malloc(100);
strcpy(str,100,"hello world");//堆区内容
皆可。
5. 函数指针
a. 调用方法
同理可以写函数指针数组int (*p[5])(int,int);
6. 特殊指针
void *q 通用指针q
NULL 空指针
7. 主函数传参
8. 动态内存申请
a. 动态内存分配的概念
b. 静态分配、动态分配
c. 动态分配函数
ⅰ. malloc();
char* p;
p = (char*)malloc(20);
ⅱ. free();
free之后一般使p=NULL;
ⅲ. calloc();
ⅳ. realloc();//重新申请内存
d. 内存泄漏
不断消耗内存,内存用尽后,程序会崩溃。
可能会存在的问题:
解决方案1:
解决方案2:
9. 字符串处理函数(包含头文件<string.h>)
linux不需要屏蔽警告
a. 测字符串长度strlen();
size_t为头文件中使用typedef定义的整数。
sizeof是测占用多少字节。
b. 字符串拷贝函数*strcpy();
c. *strncpy();
2、如果n大鱼src指向的字符串中的字符个数,则在dest后面填充n-strlen(src)个“\0”。
拷贝n个字节不包括"\0"。
d. 字符串追加函数*strcat();
e. *strncat();
f. 字符串比较函数strcmp();
g. strncmp();
h. 字符查找函数*strchr();//首次匹配
找到的是第一个字符的地址返回值
i. *strrchr(); //末次匹配
j. *strstr();//首次匹配
k. 空间设定函数*memset();(通常用于内存初始化)
l. 字符串切割函数*strtok();
10. 字符串转换数值(包含头文件<stdlib.h>)
a. 字符串转换数值(atoi整型,atol长整型,atof浮点数)
11. 格式化字符串操作函数
a. sprintf();
在网络数据组包、解包常见
b. sscanf();
ⅰ. 基本用法
ⅱ. 跳过数据
ⅲ. 指定宽度
ⅳ. 集合操作(匹配指定ASCII范围)
12. 只读关键字const
a. 修饰普通变量
b. 修饰指针
13. 结构体struct
a. 结构体定义
ⅰ. 先定义类型,后定义变量
ⅱ. 定义类型,顺便定义变量
ⅲ. 没有类型名的结构体
ⅳ. 最常用的方法
b. 结构体变量的定义初始化及使用
ⅰ. 按顺序连续初始化(下例中,可以只初始化前两个,但不能只初始化第一个和第三个属性)
ⅱ. 结构体变量成员的引用
ⅲ. 结构体成员多级引用(子类父类)
c. 结构体变量相互赋值
d. 结构体数组
e. 结构体指针
ⅰ. 变量定义、访问变量成员
ⅱ. 应用场景——保存结构体变量的地址
ⅲ. 应用场景——传结构体变量的地址
ⅳ. 应用场景——传结构体数组的地址
对照“结构体数组”及“传结构体变量的地址”的内容推导
ⅴ. 结构体变量地址的注意事项(有关指针类型和地址)
boy的指针为STU *,boy.num的指针为int *,它们类型不相同,但指向同一地址
ⅵ. 结构体数组地址的注意事项(与上一注意事项类似)
f. 结构体内存分配
ⅰ. 基本概念
Q:char和int加起来才5个字节,为什么分配八个字节内容?
A:在32位系统中,4字节寻址,按此规则分配加快存取速度。
ⅱ. 规则1:以多少个字节为单位开辟内存
ⅲ. 规则2:字节对齐(目的是空间换时间,提高CPU读取效率)
ⅳ. 指定对齐原则
此处开辟(2+2*2)字节内存,如下图
g. 位段(位域)——不能对位段成员取地址
8位一个字节,下面图中空出的16位是因为是四字节对齐。
14. 共用体union
ⅰ. 共用体的概念
ⅱ. 共用体的特点
15. 枚举enum
ⅰ. 定义方法
16. 文件
a. 标准io库对磁盘文件的读取特点
b. 文件指针
c. 打开文件
rb:作为二进制文件以只读方式打开
d. 关闭文件
e. 一次读写一个字符
perror报错
stdout是设备文件,相当于屏幕
f. 一次读写一个字符串
g. 读文件、写文件
ⅰ. fread()
ⅱ. fwrite()
h. 随机读写
ⅰ. 概念
ⅱ. rewind()
ⅲ. retell()
ⅳ. fseek()