C语言
二进制(机器语言)-助记符(汇编语言)-C语言(高级语言)
国际标准-89年-C89/C90
印象笔记/有道云笔记+xmind思维导图
语言C/C++/Java + 数据结构DS + 系统和网络(Linux+系统编程+网络基础+网络编程)
运行环境-DevC++5.11软件介绍
- 新建cpp文件,兼容c文件。
- 编译检查语法,运行即运行,调试(debug,不能是release)是模拟发布环境,可以插入断点查看代码运行
头文件
-
stdio.h 标准输入输出文件,包含各种基础语法
-
stdlib.h 标准库文件,存放各种库,内部有让程序运行后能够窗口不消散system(“pause”):暂停
system(“pause”);
动态内存分配函数malloc();void* malloc(unsigned size)
功能:申请在内存的堆区中连续分配一块size字节的空间。若申请成功,则返回指向所分配内存空间的起始地址的指针。若失败,则返回NULL。该函数具体使用时,需要强制转换为特定类型的指针。
例子:int* p=(int*)malloc(5sizeof(int));该语句定义了一个int类型的指针,指向一块存放int变量的空间,该空间大小是5个int大小,即20字节。
动态内存分配函数calloc();void calloc(unsigned n,unsigned size);——用的少
功能:和malloc差不多,唯一区别是 分配空间的数据会全部初始化为0。
动态释放函数free():void free(void* ptr)
功能:释放ptr指向的动态分配空间。若ptr为NULL,则什么都不做
备注:为保证堆区(动态存储区)的有效利用,在知道某个动态分配块不再用时,应及时将它释放 -
math.h 数学符号库,sqrt开方;pow平方;fabs浮点数绝对值;abs整数绝对值
DLL文件-动态链接库
Dynamic Link Library
可以理解为可执行文件exe的变种,多数情况下,两个文本内容类似,都是一堆机器指令。
DLL的运行依赖于别的exe文件中的线程,起辅助功能,因为它的内部包含“通用的”代码或数据;例如comdlg32.dll就是通用对话框组件库
操作系统运行exe文件流程:
- 操作系统读取exe到内存
- exe的代码说它需要dll的辅助
- 操作系统检索dll(检索要求,dll必须在下列目录:exe所在目录、Windows系统目录、Windows目录、当前目录、PATH指定的目录)
- 操作系统读取dll到内存
- 正常运行
经典算法
- 选择排序
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。 - 冒泡排序
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
常用字符串函数
函数接口 | 功能说明 | 备注 |
---|---|---|
gets(char* s) | 获取字符串s | 和scanf不同,gets接收空格,以回车结束,自动在输入字符串末尾加结束符。gets也和getchar()一样会读缓存中的内容,所以若gets前有输入,则一般会在gets前加gethcar()以提前吸收回车符. |
puts(char* s) | 输出字符串s | 输出后自动换行(换行符和回车符在ASC中编号不同,但是打出来一样 |
strlen(char* s) | 获取s的长度 | |
strcmp(char* s1,char* s2) | 按字典序比较s1和s2的大小,若s1>s2,返回整数,等于返回0,小于返回负数 | 若s1和s2是重复字符,例如aaa,则比较长度 |
strcpy(char* s1,char*s2) | 将s2的全部内容复制到s1 | 无论s1多长都会变为s2 |
时间复杂度和空间复杂度
单层循环
二重循环
语法语句
-
符号
\t:输出4个空格
\n:换行
&&:与
||:或
!:非
\0:自动添加的结束符 -
基本概念
内存4区:堆区、栈区、全局区、代码区
main{int a=1};是局部变量,存放在栈区,出了{}后,就被内存空间释放了
后面会讲到动态内存分配,将变量都存放在堆区,在程序结束(或手动释放)后才会消亡
如果把局部变量变成全局变量(放到{}以外)就会放到全局区,在程序结束后会消亡
代码区存放代码
C程序的生成:编译、链接(编译后生成.o文件-二进制文件,加上库文件,互相链接程序=exe)
C语言自定义函数:如果定义函数在主函数的后面,那么要在开头声明,类似与h文件
自顶向下、模块化设计、结构化设计 -
数据类型
int 整数 4个字节
float 单精度浮点数 4个字节
double 双精度浮点数 8个字节
char 字符 1个字节 有8位,可以表示的字符数有255个,都是ASC码表上的
字符可以用getchar()输入(一个一个的接收),putchar()输出
常量:变量类型前加上const
强制转换:有一个精度的概念,低字节转高字节一般不会错 -
输入输出
输出:printf
输入:scanf,输入要带上&符号,遇到空格结束一次(字符串可以不用&)
C语言没有字符串类型,一般通过char[]字符数组实现。
整数输入输出格式:%d
小数输入格式:float %f;double %lf
小数输出格式:统一:%f,如果要保留2位小数:%.2f
字符型:%c
指数形式输出:%e
字符串输出:%s
-
三目运算符
C语言中?:的用法类似于if和else,它是一个条件运算符,格式是表达式1?表达式2:表达式3,含义是:如果表达式1成立(值为真),则表达式2是整个条件表达式的值;如果表达式1不成立(值为假),则表达式3是整个条件表达式的值。 -
状态机思想
对于需要判断的语句有效果 -
区别整数的排序比较大小,字符串是使用string.h中封装的一些函数来的
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(strcmp(s[j],s[j+1])>0){
strcpy(temp,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],temp);
}
数组和指针
-
数组里面用输入的元素作为元素的索引的思想
a[option]++; -
数组中存储输入的方法
一维数组:同二维
二维数组:
int i,j,a[3][2];//3*2二维数组
for(i=0;i<3;i++)//一行代码可以省略{}
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);
字符数组:
char line[80];
line[79]='\0';//字符串要填结束符
while((line[k]=getchar())!='\n')//
k++;
数组是核心,在项目开发中
- 指针(指针变量)
保存数据地址的变量,称作指针变量。严格来讲指针就是数据地址。
指针的定义形式是:数据类型 *变量名:int *p
指针与其他变量的本质区别是:指针存放的是地址,其他变量存放的是数据值。所以修改p,其实是修改p存放的变量地址(修改p的指向)
取内容:p=*a
取地址:p=&a
符号的详细理解
关于&符号:- 两个之间——按位与
- 一个之前——取地址
关于*符号: - 两个之间——表示相乘
- 出现在变量类型后面——表示定义一个指向该变量型数据的指针
- 出现在一个变量前面(且*前面没有变量类型)——取内容(取出指针指向的数据单元)
指针也是变量,所以可以用常量符号修饰
- const int* p;
表示常量指针,p的值固定了,也就是p的指向固定了,但是指向的内容可以改变 - int* const p;
表示指针常量,p指向的内容固定了,但是p本身,即p的指向可以改变
分析下列代码,那个能够实现a与b的交换
void swap1(int x,int y){
int t;
t=x;
x=y;
y=t;
}
void swap2(int* x,int*y){
int t;
t=*x;
*x=*y;
*y=t;
}
void swap3(int* x,int* y){
int *t;
t=x;
x=y;
y=t;
}
只有swap2能够实现a与b的交换
- 传递的是形参
- 传的是指针,所以t保存的是x所指向的变量,即实参
- 传的也是指针,但是t保存的是指针x,而不是指针所指向的变量
对指针的浅显应用理解:在函数中使用指针,可以不用返回值,通过指向的方法本质是在函数中改变实参了。
- 数组等价于指针
在函数传递中:int* a等价于int a[],单独的a就是数组的首地址
递归与宏定义
-
递归
递归的本质就是:在函数内部调用函数,同时准备一个判断条件
递归不断调用函数,可能会出现栈溢出的现象,因为没有完成的函数都存在内存的栈区
递归是最底层的先处理 -
宏定义
单纯的文本替换
可以定义函数
#define max(a,b) a>b?a:b
与全局变量不同
结构体
结构体是自定义得数据类型,所以它也有一般数据类型的性质,比如定义数组、定义指针等等,在结构体中,可存放多个不同类型的数据,这是与一般数据类型的最大区别
struct stu{
char x;
int y;
float z;
} a;
//这样就定义了一个名为a,数据类型为stu的变量,a.x=
//以上是C语言,如果是C++语法,直接不用a,用stu即可定义变量,要先实例化,直接stu s;s.x=
为了简化上述式子,可以使用typedef关键字定义结构体,简化书写
可存放多个不同类型的数据,这是与一般数据类型的最大区别
struct stu{
char x;
int y;
float z;
} a;
//这样就定义了一个名为a,数据类型为stu的变量,a.x=
//以上是C语言,如果是C++语法,直接不用a,用stu即可定义变量,要先实例化,直接stu s;s.x=
为了简化上述式子,可以使用typedef关键字定义结构体,简化书写