一、数据类型及控制语句
1.C语言的注意点
- 面向过程
- 一个必有一个mian函数
- 注释 // /* */
2.C语言框架
一个.c对应一个.h
mian.c中调用头文件
分文件分函数
3.定义数据关键字
float:单浮点型(带小数) 4字节 float b=3.8f;
double :双浮点,8字节 double b=3.8;
char:字符型 1个字节 有符号 0~255,字符型的数据在内存中存放的是ASC码
short:短整形 2字节 -32768~32767
int:整形 32位系统下占4字节 16位下占2字节 -20亿~20亿
struct:结构体类型
union:联合体
enm:枚举
4.正数和负数在内存中的存储形式
正数:原码
负数:最高位为符号位,1表示负数。补码
补码:负数的反码+1;
5.存储相关关键字
register:寄存器变量,不能修饰数组,不能修饰浮点数,不能取地址;
static:静态变量
const:常量,只读变量不能修改,可修饰指针
outo:
extern:(外部)用来声明函数和全局变量
6.其他关键字
sizeof (a):测量a在内存中占的字节数
typedef :重用名相关关键字
eg:typedef short ont INT16;
volatile:易改变,
7.C语言命名规则
有字母数组下划线构成,且不能以数字开头
8.格式化输出
%d:十进制有符号数
%x: 以十六进制表示整数
%s:字符串
%c:单个字符
%p:指针的值
%u:十进制无符号整数
%o:以八进制表示的整数
%f: float型
%lf:double型
另:%4d(占四个位置,右对齐);%04d(左边补3个0);%-4d(左对齐);%7.3f(占7个位置,小数点后三位)
9.类型转换
自动转换
字节少的往对的转换
强制转换
(类型说明符)(表达式)
10.位运算
&:按位与 ,任何值与0得0,与1不变
|: 按位或,或1的1,或0保持不变
~:按位取反
^:按位异或,不同为1,相同为0;
位移:
>>:右移,
逻辑右移:高位补0,低位溢出
算术右移:a.有符号数,低位溢出高位补符号位;b.无符号位于逻辑右移同
<<:左移,高位溢出,低位补0;
11.选择分支控制语句
if(){...}else(){...};
.......
12.循环语句
for循环
while循环
do{//循环体}while(条件表达式);
break:跳出循环;continue:结束本次循环进入下一次循环
goto: eg .goto a;.....a;
二.数组
1 概念及分类
- 若干个 变量 有序存储的集合
- 字符数组
- 整形数组
- 指针数
2.一维数组
3.二维数组
4.字符数组
*char c1[3]={'a','s','s'}; 占3个字节
char c2[3]="asd"; 占4个字节,字符串以\0结束*
三.内存的概念及分区
1.概念
物理内存:实实在在的存储 设备
虚拟内存:操作系统虚拟出来的内存
进程:正在运行的程序
2.分区
堆:动态申请内存时在堆里开辟内存
栈:主要存放局部变量
静态全局区:
未初始化的静态全局区
初始化的静态全局区
代码区:存放程序代码
文字常量区:存放常量
三.变量
1.普通全局变量
函数外部定义的变量
不赋初值为0
作用在程序所有地方
声明:entern int num;
程序结束自动释放
2.静态全局变量
用static修饰
只能在本定义的.c文字中使用
3.普通局部变量
函数内部定义,有效
函数结束时释放失效
不赋初值时随机数
4.静态局部变量
在函数内部定义,用static修饰
函数结束时不释放
以后再调用时不再为其开辟空间,也不赋初值
5.变量重名问题:局部变量和全局变量可以重名
6.内部函数:定义函数时前用static修饰
7.外部函数
四.函 数
1.概念:实现一个功能的代码封装
2.分类:
库函数:C库实现
自定义函数:自己实现的函数
系统调用
3.函数的定义
注:形参必须带类型
函数内部不能重复定义
4.函数的声明
对已定义的函数进行声明
关键字:extern
5.函数的调用
6.函数总结
定义一次多次调用
代码模块化
五、预处理、静态库、动态库
C语言编译过程
1.预处理:将.c的头文件展开、宏展开生成.i
2.编译:将预处理之后的.i文件生成.s汇编文件
3.汇编:生成.o目标文件
4.链接:将.o链接成目标文件
预处理
include<>/""
宏定义:#define PI 3.14
终止宏:#unde
带参宏:#define S(a,b) a*b
防止头文件重复定义
#ifndef _ AA_H_ \n #define_AAA_H_ \n …\n #endif
原理:选择性编译
静(动)态库
静态编译使用静态库(大)
动态编译使用动态库(小)
静态库的制作及使用
命令1:gcc -c mylib.c -o mylib.0
命令2:ar rc libtestlib.a mylib.o
注:静态库起名时必须以lib开头以.a结尾
静态库
六、指针
1.内存的概念
存储器:存储数据的器件
外存:外部存储器,掉电不丢失数据
内存:内部存储器,掉电丢失
物理内存
虚拟内存
2.指针的相关概念
指针就是地址(0x00000)
指针变量:用来存放一个地址的编号
对应类型的指针变量只能存放对应类型的变量的地址
3.指针的定义
数据类型 * 指针的变量名;
eg: int * p;
*用来修饰变量的,变量名为p
指针的运算符:&取地址、取值
32位系统下指针都占4个字节
注1:+指针 取值,取几个字节由指针类型决定的
注2:指针++,指向下个对应类型的的数据
字符指针++,指向下个字符数据,指向存放的地址编号加1
整形指针++。指向下个整形数据,指针存放的地址编号加4
4.指针的分类
字符指针
整形指针
5.指针与数组
c语言规定:数组的名字就数组的首地址,是个常量,eg:p=a;
注:p和a不同,p是指针变量,a是常量
p=a与p=&a[0]是等价的
6.指针的运算
指针加减
两个相同类型的指针比较大小
两个相同类型的指针可以相互赋值
7.指针数组
指针和数组的关系
1.指针可以保存数组元素的地址
2.定义一个数组,有若干个相同类型的指针变量。,这个称为指针数组
定义方法:类型说明符 * 数组名[元素个数];
指针数组的分类
8.指针的指针
int **p;
9.数组指针
回顾:数组 的名字是数组的首地址,是第0个元素的地址,常量,数组名+1指向下一个元素
int (*p)[5] ;//定义一个数组指针变量p,p指向的是整形的有5个元素的数组。p+1 往下值5个整形,跳过一个有5个整形元素的数组。
注:数组名取地址变成数组指针,+1跳一个这样的数组的大小
10.函数指针
void (*curfun)(void);
七.字符串处理函数
strlen(const char *s); //测字符串长度函数
strcpy(char *dest,const char *src);//字符串复制
strncpy(char *dest,const char *src,size_t n);//注:不复制\0
strcat(char * dest,const char *src);//字符串追加
strncat(char *dest,const char *src,size_t n);//注:追加\0
strcmp(char *str1,char *str2);//字符串比较
strchr(char *s,char c);//字符查找,返回地址
strstr(char *s,char *s1); //字符串查找,
memset(char *s,char c ,int n);//n:字节个数
1.字符串数据转换
头文件:#include<stdlib.h>
atoi()
atol()
atof()
2.字符串切割:strtok(str,". : * “);
3.格式化输出:sprintf(buf,”%d:%d:%d",2019,8,2);
4.格式化输入:sscanf(“2019:8:2”,%d:%d:%d,&a,&b,&c);
5.const:修饰变量,指针,只读不可修改