C语言编程
第一个程序
vim ***.c
Inc+tab 自动补全头文件
main+tab 自动补全主函数
//表示单行注释
/*注释*/表示多行注释
#if 0 ***********#endif 表示使用宏实现的注释
gcc编译器
直接运行 gcc *****.c 默认生成a.out可执行文件
指定生成的可执行文件 gcc******.c -o 可执行文
件
分步编译 预处理--编译--汇编--链接
(-ESc---.iso)
预处理:展开头文件,替换宏,删除注释
gcc -E ***.c -o ***.i
编译:检查语法的正确性,生成汇编文件
gcc -S ***.i -o ***.s
汇编:把汇编文件转换为二进制文件(目标文件)
gcc -c ***.s -o ***.o
链接:把二进制文件链接为可执行文件
gcc ***.o -o 可执行文件
./可执行文件
进制转换
概念:按照某种进制实现的转换方式
进制表示方式
二进制B:ob000101
八进制O:06878
十六进制H:0x787
十进制D:132
转换
十进制转换n进制:除以n,逆向取余
n进制转换十进制:位权展开求和法
二进制转换八进制、十六进制:小转大合
八进制十六进制转换二进制:大转小拆
有无符号数
不存在正负之分
存在正负之分,最高位表示符号数
计算机的算数运算:只有加法器,计算用补码
正数的原码,反码,补码一样
负数反码:最高位不变,对原码取反
负数补码:反码+1
数据类型
分类
基本类型
整数
有符号
int:4字节 %d %i
short:2字节 %d
long:64位8字节 %ld
long long:8字节 %ld
无符号
unsigned int:4字节%u
unsigned short:2字节:%u
unsigned long:64位8字节lu%
unsigned long long:8字节%lu
小数
单精度浮点数 float:4字节%f
多精度浮点数 double:8字节%lf
字符
有符号字符 char:1字节 %c,%d,
无符号字符 unsigned char:%u,%d,%c
枚举
构造类型
数组
结构体
共用体
指针类型:指针
空类型:void
常量(宏)
整数常量 #define A 100
小数常量#define PAI 3.14
字符常量#define CH 'A'
字符串常量#define STR "hello"
变量
定义:存储数据的容器,值可变
整数变量
定义:int a; int a,b,c;
初始化:int a=100;
赋值:int a; a=100;
数据溢出:如果数据赋值越界则会重新回到最大
值或最小值
浮点数变量
定义:float a; double a,b,c;
初始化:float a=3.14;
赋值:float a;a=3.14;
%f\%lf默认输出的小数位式6个小数点
字符变量
定义:char a;char a,b,c;
初始化;char a=‘a’;char a=97
赋值:char a; a='a'
数据溢出:如果数据赋值越界则会重新回到最大值
或最小值
类型转换
隐式转换float a=3.14----int b=a ----b=3
显示转换float a=3.999 ---int b=(int)a----b=3
大小端存储
高地址存储数据低位
高地址存储数据高位
有无符号数间的转换
int/long 把有符号数转为无符号数进行运算
short/char 把有无符号数转换为有符号数int
输出
C语言输出函数#include <stdio.h>
int printf(const char *format, ...);
格式:printf("hello world");
输入
#include <stdio.h>
int scanf(const char *format, ...);
格式scanf("%f%f%f%lf%d",&b,&c,&d,&g,&k);
getchar/putchar
getchar
功能输出单字符
格式
char a;
a=getchar(); //输入字符变量a
putchar
子主题 2
格式
char a='A';
putchar(a); //输出变量
putchar('A');//输出常量
putchar(10);
运算符
算数运算:+ - * / % ++ --
关系运算: > >= < <= == !=
逻辑运算:&& || !
条件运算|三目运算
格式:表达式1?表达式2:表达式3
赋值运算 = += -= *=
逗号运算:最后一个表达式是最终的结果
每个表达式均执行
位运算:对二进制操作 & | ^ ~ >> <<
运算符的优先级
括号> 单(单目运算)> 算(算数运算)> 移(左移右
移)> 关(关系运算)> 与(按位与)> 异或> 逻(逻辑)>
条(条件)> 赋值>逗号
三大控制结构
顺序结构:程序自上而下
选择结构:按照某种选择执行特定功能
单分支选择结构
格式if(表达式) {c语句;}
双分支选择结构
格式 if(表达式){c语句1;}else {c语句2;}
多分支选择结构
格式 if(表达式){c语句1;}else if(表达式2){c
语句2;}.....else {c语句n;}
if语句的特殊用法
使用==:if(a==5)---if(5==a)
判断整数a值为0:if(a==0)----if(!a)
判断整数a的值不为0,if(a!=0)----if(a)
switch
执行速度最快
格式:
switch(表达式){case 常量表达式1:break;
case 常量表达式2: break;case 常量表达式
3:break;....... default:break;}
break可有可无
多个case可以执行同一句话
表达式可以是任意表达式,最终结果必须是整数
或单字符类型
常量表达式只能是常量或者单字符常量
循环结构
定义 while ;do ...while;for重复执行某一段代码
while 当型循环,先判断后执行
格式:表达式1;while(表达式2);{循环体;
表达式3;}
执行过程:如果表达式2条件为真,则循环,否
则结束循环
while的死循环while(1){}
do...while 直到型循环,先执行后判断
格式表达式1;do {循环体;表达式3;}while
(表达式2);
,条件为假则退出循环
死循环为do{}while(1);
for属于当型循环,先判断后执行
格式(表达式1;表达式2;表达式3){循环体;}
执行过程:如果表达式2为真,则循环,表达式2
为假则退出
死循环for(;;){}--------for(1;1;1){}
循环跳转语句
break 结束一层循环
使用场景switch及while ;do..while;for
不可单独用于if语句
continue 结束本次循环进入下次循环 用于while ;do ,,,while;for
return 结束函数
goto 无条件跳转
exit退出整个程序
循环嵌套
数组
定义:使用一段连续的存储空间存储类型相同的
构造类型(数组、结构体、共用体)
一维数组
定义:使用一个下标表示的数组
格式:存储类型 数据类型 数组名[常量表达式]
int a,b,c,d;---int arr[4]
存储类型:auto extern register const
volatile static
数据类型:基类型 构造类型 空类型 指针
一维数组命名
常量表达式表示数组的元素的个数
定义时常量表达式不能为0,不为空,不为小
数,初始化时不为变量
一维数组初始化\赋值
全部初始化 int arr[5]={1,2,3,4,5};
部分初始化
int arr[5]={1,2};
int arr[5]={o};
单个赋值
int arr[5];
arr[0]=11;
arr[1]=22;
剩余元素默认是随机值
省略数组长度初始化 int arr[]={1,2,3,4,};
数组清零
memset
格式#include <string.h>
void *memset(void*s,int c,size_t);
void*s表示数组变量名
int c表示清的值
size_t表示数组字节大小
使用格式 int[5];
memset(arr,0,sizeof(arr))
bzero
格式#include <string.h>
void *memset(void*s,size_t);
void*s表示数组变量名
size_t表示数组字节大小
使用格式int arr[5];
bzero(arr,sizeof(arr))
计算数组长度
sizeof(arr)/sizeof(int)
sizeof(arr)/sizeof(arr[0])
一维数组的引用
下标从零开始,n元素的数组,下标[0,n-1]
int arr[5],0-4
数组元素的引用arr[0] arr[4]
循环引用
越界访问
越界访问的内存没有被占用,可以访问,访问结
果是随机值
如果越界访问的内存被占用,存储不重要数据,
可以访问,访问结果是随机值
如果越界访问的内存被占用,存储重要数据,不
可以访问,段错误
段错误表示访问了不该访问的内存空间
一维数组的地址
数组的地址是连续的
数组名表示数组的首地址,arr----arr[0]
排序
冒泡排序
对于一个待排序序列,依次拿前一个和后一个进
行比较,如果第一个大于第二个则交换,直到最
后一个元素为最值,如果序列为无序序列,重复
以上操作
简单选择排序
对于一待排序序列,默认第一个元素为最值,如
果比最值还大或者小,则交换,直至序列为有序
序列
多维数组
定义:使用两个下标表示的数组
格式:存储类型 数据类型 数组名[常量表达式1][常
量表达式2]
常量表达式1,表示行,初始化可有可无
常量表达式2,表示列,必须存在
arr[m][n]字节大小m*n*4
初始化\赋值
全部初始化
部分初始化,剩余元素填充0
二维数组的引用
数组下标从0开始,arr[m][n]下标分别为[0,m-1]
[0,n-1]
字符数组
定义及初始化
格式:存储类型 char 数组名[常量表达式]
char str[10],存储十个字符
字符数组:存储一个或多个字符的容器
0个或多个字符的容器(标志是' ')
字符数组>字符串,字符数组存储字符串
初始化
单字符初始化
字符串初始化
一维字符数组
单个字符打印for循环 strlen(str)计算字符串数组的长度
字符串整体引用 %s, ----遇到