指针和变量
int *a; 定义int变量的地址(指针变量a)
int b; 定义变量b
&取地址符 *解引用 取地址引用的值
&b 变量b的地址
*a a内容为地址存放的变量
空指针不能直接赋值,要先赋予地址。
野指针指的是还没有初始化的指针
指针的范围和系统有关比如你的32位系统,指针长度为4,在64位操作系统下为8,变量也一样和系统有关具体用sizeof()判断字节。
在C语言中在main函数后定义函数,在使用前,需要在main函数前进行声明,否则会报错。
指针和数组
数组名本身就是一个指针(地址),它代表了数组的首地址,数组在内存中连续存放
指针+1或-1向上或向下移动sizeof(类型)个字节
sizeof(数据类型/变量名/指针变量名)//返回所占字节数 如sizeof(int)
指针变量和数据类型的大小编译器而异
数组与指针的关系
数组的指针
例子 用数组的指针取数组的值
指针的数组
存放指针的数组
分辨小技巧
最外边 * +变量名 加括号肯定就是指针
*+变量名后面带数组 没加括号就是数组
函数指针
|
|
typedef
|
|
预处理器
预处理器是一个文本替换工具
预处理器 | 说明 |
---|---|
#include | 导入头文件 |
#if | if |
#elif | else if |
#else | else |
#endif | 结束 if |
#define | 宏定义 |
#ifdef | 如果定义了宏 |
#ifndef | 如果未定义宏 |
#undef | 取消宏定义 |
宏
文本替换,每个使用到的地方都会替换为宏定义。
宏是在编译期间起作用,还没到运行期间,不会造成函数调用的开销(开辟栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆
生成的目标文件大,不会执行代码检查
|
|
|
|
内联函数
|
|
区别
1、编译器会对内联函数的参数类型做安全检查或自动类型转换,而宏定义则不会,他只是进行单纯的文字替换,不会做任何类型的检查
2、内联函数在运行时可调试,而宏定义不可以。
3、内联函数可以访问类的成员变量,宏定义则不能
4、在类中声明同时定义的成员函数,自动转化为内联函数。
动态内存分配
静态内存是存放在栈里面的 动态内存是存放在堆里面的 函数结束出栈只释放静态内存
malloc.h 动态存储分配函数头文件,当对内存区进行操作时,调用相关函数.ANSI标准建议使用stdlib.h头文件,但许多C编译要求用malloc.h,使用时应查阅有关手册。一般来说stdlib.h包含malloc.h。
为什么需要动态内存,一般变量只在其方法终止后才会释放对应内存,而动态内存可以随意释放,更加节省内存。
malloc
没有初始化内存的内容,一般调用函数memset来初始化这部分的内存空间.
calloc
申请内存并将初始化内存数据为0
realloc
对动态申请的内存进行扩大调整
alloca 栈申请内存
在栈申请内存,因此无需释放.
多级指针
|
|
|
|
常量
|
|
可变参数
|
|
结构体
定义结构体有多种方法
|
|
共用体
共用里面的变量共用一个内存
字节对齐
1、某个变量存放的起始位置相对于结构的起始位置的偏移量是该变量字节数的整数倍;
2、结构所占用的总字节数是结构中字节数最长的变量的字节数的整数倍。
|
|
枚举
|
|
字符串定义
|
|