超全面的C语言知识点归纳概括

C语言之父——丹尼斯里奇 1972年在BCPL语言基础上开发C语言;
C语言的优点:
(1)稳定
(2)python、mysql数据库等很多软件都用C语言开发
(3)易于移植,通用性好
(4)运行效率高
(5)操作系统,驱动程序都用C语言开发
C语言32个关键字:
Int long short signed unsigned double float char
auto extern static register union typedef void const
volatile for while do break sizeof goto if
else return switch case default continue enum continue

一个C语言程序有且只有一个main函数
多文件编程时,整个程序只有一个main函数

C语言基本数据类型:
1.int 整型 4字节 -231~231-1 unsigned int 0~2^32-1
2.shrot 短整型 2字节 -216~216-1 unsgned short 0~2^16-1
3.long 长整型 4/8字节
4.long long
5.char 字符型 1字节
6.float 单精度浮点型 4字节 1个符号位,8个指数位,23个小数位
7.double 双精度浮点型 8字节 1个符号位,11个指数位,52个小数位

sizeof : 运算符,求数据类型所占字节长度

计算机中存储数据以补码形式存在
原码:最高位表示符号位,其他位表示数值位
反码:正数没有,负数的反码等于符号位不变,其余位按位取反
补码:正数没有,附属的补码等于原码符号位不变,其余位按位取反,最后+1

变量:数据类型 标识符
定义变量实际上是分配了一块栈内存,用标识符能供引用到该内存区域的数据
标识符:
(1)由字母、数字、下划线组成
(2)开头不能是数字
(3)不能是关键字

字符与编码
Unicode编码
Utf-8,gdb是unicode编码的中文解决方案
转义字符:
\n 换行 \t tab \b \
运算符
(1)算术运算符 + - * / %
(2)自增减运算符 ++ –
①左值:可以放在=左边 内容可修改
②右值:不可以放在=左边
(3)赋值运算符
= += -= *= /= %= &= |= ^=
赋值语句从右往左执行
(4)比较运算符(关系运算符)
> < == != >= <=
(5)逻辑运算符
&& || !
短路特性:
当&&连接的多个表达式前面的结果为false时,不会执行后面的表达式;
当||连接的多个表达式前面的结果为true时,不会执行后面的表达式。
(6)位运算符
& | ~ ^ >> <<
-1的二进制(补码)码全是1
0&num=0 -1&num=num
0|num=num -1&num=-1
~num=-(num+1)
0^num=num -1^num=~num=-(num+1)
>> 对于signed数据类型,左边空出位补符号位
对于 unsigned数据类型,左边空出为补0
<< 右边空出位补0
(7)三目运算符 ? :
(8)sizeof运算符
sizeof 之关系内存宽度,不会计算表达式
表达式如果是一个混合类型,结果取内存宽度最大值
表达式在计算时数据会进行转换
char–>int
short–>int
unsigned char–>unsigned int
sizeof(函数名)==1
sizeof(函数名(参数))==函数声明返回值类型宽度 函数不会调用
sizeof(指针)==4/8

运算符优先级:
! > 算术运算符 > 关系运算符 > && > || >赋值运算符
~ > 算术运算符 > 移位运算符

switch(常量表达式)
常量表达式的结果只能是整数或者枚举
常量值: int float char(string) const修饰的 #define enum
case 常量字面值:
不能是变量,值必须明确
case后面的值不能重复

for和while区别:
(1)for循环次数基本固定、while循环次数不确定
(2)for循环条件可以省略,while循环条件不能省略

数组
数组是一种最简单的数据结构
数组是一片连续的内存空间,数组名表示该连续内存的首地址

数组的定义:
	(1)当数组定义之后不能在对数组进行整体初始化
	(2)数组初始化元素个数不能大于数组长度
	(3)数组长度可以省略,由初始化时给定元素个数决定,如果省略数组长度,必须给定初始化元素

可变长数组:
	先定义一个变量n
	再给n赋值
	再定义一个数组arr[n]
	arr[n]不能用={}的形式初始化
	
	二维数组定义时arr[m][n],n必须给定

函数
作用:把具有一定功能的代码封装,需要时调用,提高代码复用率
函数形参变量只能在函数中使用
函数声明和定义可以分开,C语言在编译代码时,如果编译到一个函数调用,而该函数没有被声明和定义,则会隐式声明一个函数,该函数的返回值类型默认为int

编译步骤
(1)预处理 gcc -E
导入include头文件以及define宏替换
(2)编译 gcc -S
将预处理过的文件汇编为.s文件
将代码”翻译”成汇编代码
会检查语法格式错误:关键字写错、变量名未声明
(3)汇编 gcc -c
将编译完成的汇编代码”翻译”成机器代码
将编译完成的文件汇编成.o目标文件
会检查语法错误
(4)链接 gcc .o
将多个目标文件链接成可执行文件
链接所有的函数,如果某一个函数不存在,则报错
gcc -g 生成调试信息,当程序运行出现段错误时,会生成core文件

预处理指令
以#开头
(1)include<>从系统所指定的路径查找头文件,若不存在则报错
(2)Include””从当前路径下查找头文件,如果没有,则取系统指定目录下查找,若还没有,则报错
(3)#define宏定义
只是进行简单的替换!!!! 笔试的坑!!!
#define STR(a) #a 可以把标识符a变成一个字面值字符串
#define CON(a,b) a##b 可以把a和b合并成一个标识符
宏定义可以在编译代码时指定 gcc -D 宏=v .c
#undef 删除宏 取消宏定义
宏函数不要用++ – 操作 在传参时也不要用++ –
指针
所谓指针,指的是变量的内存地址,是一个十六进制的整数值
& 取址运算符 &n取得变量n的地址
* 取值运算符 取得一块内存地址中的数据

内存地址
每一个程序都有独立的4G虚拟内存地址,从0开始编号,一个地址8个二进制位
虚拟内存地址通过一定的方式映射到物理内存地址

内存地址:0x0000 0000~0xffff ffff (数值取值范围)

指针变量
	指针变量是一个存储内存地址的变量
	未初始化的指针变量成为野指针  非常危险!!!在编译时不会报错!!!

	指针加减运算:即内存地址加减
	指针+1:1个单位长度的内存

	定义时需注意
		int *a,b; 	 // a是int*   b是int
		int* a,b;	// a是int*   b是int

万能指针 void*
	不能取*操作

4G虚拟内存空间
	栈区:不会初始化
	bss:会自动清”0”

变量
全局变量:
存储在全局数据区(数据段,bss段)
生命周期:程序运行期间
作用域:整个程序
局部变量:
存储在栈区
生命周期:函数调用期间
作用域:定义开始到函数结束
块变量:
存储在栈区
生命周期:语句块执行期间
作用域:定义开始到语句块结束
变量修饰词:
auto static const register volatile extern

	auto int x; 自动的
		在C语言中局部变量默认是auto,一般不使用,写和不写一样

	static int x; 静态的
		static修饰的局部变量:静态局部变量
		静态局部变量和普通局部变量的区别:
			(1)存储位置不一样
				①静态局部变量存储在全局区
				②普通局部变量存储在栈区
			(2)生命周期不同
				①静态局部变量 从定义开始到函数结束
				②普通局部变量 从定义开始到函数调用结束
			(3)作用域一样
			(4)静态局部变量的定义语句只会执行一次,后面自动忽略
			
		static修饰的全局变量:静态全局变量
			静态全局变量和普通全局变量的区别:
			(1)存储位置一样
			(2)生命周期一样
			(3)作用域不同
				①静态全局变量的作用域为当前文件
				②普通全局变量可以在任何文件中使用
	
	extern int x; 声明
		声明外部定义过的变量
		只是声明,不是定义语句,不会再分配内存
		(1)局部变量和全局变量同名,访问全局变量
		(2)声明在其他文件中定义的变量
		
	const int x; 只读的
		修饰的变量表示只读,不能修改(可以通过指针的方式修改)
	
	register  寄存器变量
		申请把一个变量作为寄存器变量存放在啊CPU内部寄存器中,从而提高访问速度,对于需要频繁访问的对象可以申请为寄存器变量
		不是所有变量都可以作为寄存器变量,只能允许4字节
		寄存器变量不能取& 因为不在内存区域
	
	volatile 易变的
		多线程、多进程,表示该变量的值随时可能发生变化  

字符串
一串以’\0’为结尾的字符成为字符串
存在形式:
(1)字面值
①存储在代码段,子面子相同的字符串在内存中只保留一份
②不可修改,一旦修改,段错误
(2)字符指针
记录一个字符在内存中的地址,因为字符串是以’\0’结尾的一串字符,所以记录第一个字符地址姐可以
(3)字符数组
①一个存放字符类型的数组
②在数组中要预留一个存放’\0’的位置

const 与 指针
const char *p 常量指针,是一个指针,指针指向一个常量  *p只读,p可以修改
char const *p	常量指针,与上述一样
char* const p	指针常量,是一个常量,p只读,*p可以修改,指向一个地址后不可以改变指向,但指向的地址里的数据可以改变
const char* const p       p和*p都只读

字符串IO函数
	scanf 从输入缓存区读取数据,如果缓存区没有数据,则等待用户从键盘输入,用户输入的内容会被原样记录到输入缓存区中
	printf 从程序中输出到输出缓冲区中,当到达一定条件时,才从输出缓冲区中输出
		输出条件:
		(1)遇到\n
		(2)强制刷新 fflush(stdout)
		(3)输出缓冲区满了 4K
		(4)程序结束
		printf函数有返回值,返回输出的字节数(字符个数)

不定长参数列表
在形参列表中可以声明为…但…之前必须要有一个有名参数
这个有名参数用来直接或者间接指定后面…代表参数的个数和类型
有一套函数:
#include <stdarg.h>
void va_start(va_list ap, last); //初始化一个va_list不定长参数列表变量
type va_arg(va_list ap, type); //获取不定长参数列表中的一个参数
void va_end(va_list ap); //释放不定长参数列表资源
void va_copy(va_list dest, va_list src); //复制一个不定长参数列表

日志
日志级别一般有6级
(1)TRACE
(2)DEBUG
(3)INFO
(4)WARRING
(5)ERROR
(6)TATAL

结构体
(1)结构体是一种自定义类型
(2)结构体变量在定义后不能再进行整体赋值
(3)结构体变量之间可以相互初始化和赋值

结构体的对齐补齐:
	结构体成员对齐摆放:从自身长度的整数倍的位置开始存放,超过4按4计算
	结构体长度补齐:结构体的长度会补齐为成员最大长度的整数倍,如果超过4按4计算

位域
struct A{
char c1:1;
char c2:3;
char c3:2;
} ;
sizeof(struct A)==1;

struct B{
		char c1:4;
		char c2:3
		char c3:2
};
sizeof(struct B) == 2
浮点类型不能作为位域的成员类型,位域不可以取地址

联合 共用体 union
(1)所有成员共用同一块内存
(2)联合体的大小取决于最大的成员的字节大小

可以用联合来判断计算机的存储方式
	大端:低地址存储高字节的数据  	网络传输过程一律用大端
	小端:低地址存储低字节的数据	大多数计算机都是小端
	例: 0x12345678  低字节为  0x78
		bool islittle(){
			union A{
				char c;
				int i;
			}; 
			union A  a;
			a.i=1;
			return a.c==1; 
		}
		
		int isLittle(){
			int num = 1;
			char *p = (char *)(&num);
			if(*p == 1){
				return 1;
			}
			return 0;	
		}

枚举 enum
(1)枚举值是一些整数
(2)枚举值(标识符)不能重复,默认从0开始逐一递增
(3)枚举值可以自己赋值,自赋值后的枚举值在此基础上递增1

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值