一、1.内存与地址
2.指针变量和地址
3.指针变量类型的意义
4.const修饰指针
5.指针运算
6.野指针
7.assert断言
8.指针的使用和传址调用
1.内存与地址
常见内存单位:
1 byte = 8 bit
1 KB = 1024 byte
1MB = 1024KB
1GB = 1024MB
1 TB = 1024 GB
1 PB = 1024 TB
内存单元编号==地址==指针
2.指针变量与地址
1.取地址操作符(&)
&a可理解为:为变量a开辟一份内存空间(==地址==指针)用来存放变量a
2.解引用操作符(*)
通过(&)我们拿到的是地址,(*)以为从地址中提出
可理解为&就是将钱存入ATM机,*就是取出钱,ATM机就是那份空间
3.如何看指针类型
3.指针变量类型的意义
例如:char*l类型的指针 指针变量+1可以跳过1个字节
int*类型的指针 指针变量可以跳过4个字节
且塔曼的访问权限不一样即一次性可以访问多少个字节
void*指针类型可以方便泛型编程,使一个函数可以处理多个类型的数据
4.const修饰指针
const起到“固定的作用”,,当你不想让某个人修改某一变量时可以使用const
修饰指针时
* const p 意为不允许修改p中存放的地址
const * p 和 * const p是一样的 意为不允许修改*p所指向的变量
5.指针运算
指针+-整数
指针-指针
指针的关系运算
6.野指针
1.野指针成因:指针未初始化 指针越界访问 指针指向的空间释放
1.规避野指针:指针初始化(给指针赋值NULL) 小心指针越界访问 及时置NULL,检查使用之前的有效性 避免返回局部变量地址(这点容易忘)
7.assert断言
#define NDEBUG//宏定义 预处理
#include<assert.h>//assert的头文件名
assert(p !=NULL)//如果p!=NULL为假就执行接下来的代码,否则报错,程序终止,并告知第几行有问题,对程序员友好
8.指针的使用和传址调用
1.传值调用与传址调用
传值调用会开辟新的内存空间,形参只是实参的临时拷贝
传址调用会将地址传到函数中去,可供直接使用
Add:编者个人认为重要的点:
1.数组名是数组首元素的地址
2.gets()相比scanf读取数据可以忽略空格
3.strcpy();字符串拷贝(后拷前)
4.strncat();字符串拼接(有限)
5.strcat();字符串拼接(全)
6.strstr();字符串查找
7.arr[i]==*(arr+i) arr[i][j]==*(*(arr+i)+j)
8.int(*p)[10]//是指针指向一个数组,是指针
9.*&arr==arr
10.函数名==&函数名
11.//函数声明
void(*signal( int, void(*)(int) ) )(int);
//可理解为:
//void(*)(int) signal(int, void(*)(int)) //err
12.typedef 重命名