
1.指针的概念类比其他的数据类型整型用来存放整型数的浮点型用来存放浮点数的字符型用来存放字符指针是用来存放地址的一种类型2.指针的大小根据操作平台的位数相同32位平台的话指针就是32位的64位平台就是64位的3.创建指针int * point所有的创建变量都可以看成是 type 变量名对于指针来说type -- int *:这个是一个指针它指向的地址用分析整型int的方式来处理变量名 --- point:这个是指针的名字当你想要修改某个地址的数值时你就需要先将这块地址给过去然后再在地址上面修改里面的数据#include stdio.h void func(int *ret) { *ret 20; //这里的ret是指针要通过解析指针才能对其赋值 } int main(void) { int ret 10; int *point ret; //让指针指向这块地址 func(point); //通过指针将地址传入函数中这样在函数内的操作就能够修改ret的值了 printf(%d, ret); }在为数据赋值时要遵顼几个原则常量包括数组名、字面量不能被赋值赋值号左右两边的数据类型要相同或兼容赋值号左边必须是可修改的左值有明确内存地址的变量不可修改的1.数组名 int buf[10] {0}; buf; ❌但是可以 buf 12.常量 3 4 ❌3.表达式 (a b) 4 ❌类型不同时会隐式转换注意大转小会截断丢失数据指针类型必须严格匹配除非使用强制类型转换结构体可以直接赋值但数组不能整体赋值对于第三点补充一下数组名是不能进行偏移的但是指针是可以的#include stdio.h int main(void) { int num_buf[10] {1,2,3,4,5}; int * p_num num_buf; //num_buf 错误操作 printf(%d\n, p_num); p_num; //规范操作 printf(%d\n, p_num); }4.指针支持减运算以及比较符同类型的前提下#include stdio.h int main(void) { int *p, *q; p mallo(100); //申请100个字节大小的内存 q p 2; //q是指向p偏移2个int8个字节地址后的位置 q - p; //可以得到q和p之间隔了多少个int类型不是字节 printf(q和p相差%ld\n, q - p); q p; //值为True if(q p) printf(q的地址比p的地址高); }⚠️注意指针仅支持上述两种减运算和比较并且是在同类型指针的前提下不支持其他的运算符5.指针的应用场景优化大块数据的传参效率避免对大结构体或数组进行拷贝仅传递其地址从而减少内存开销并提升性能。动态内存分配配合malloc与free等函数管理堆内存实现运行时灵活的内存申请与释放。实现动态数据结构用于构建链表、树、图等数据结构中节点之间的连接关系。实现多返回值通过指针参数使函数能够间接返回多个结果值。操作硬件或显存通过mmap等系统调用将物理地址映射到进程空间从而用指针直接读写设备内存。高效处理字符串和数组通过指针算术运算直接遍历和操作内存中的连续数据提升处理效率。实现回调机制函数指针将函数地址作为参数传递实现回调功能增强代码的模块化与灵活性。这些在后续的指针使用中都是非常实用且强大的功能6.其他类型的指针1.野指针其实就是创建后没有赋初值的指针没有明确的指向⚠️注意不能操作野指针有内存越界的风险程序容易出现问题2.NULL指针NULL指针其实就是内存里面的第0位为了防止野指针我们可以在创建指针的时候先为其赋值为NULL int * point NULL;3.悬空指针当通过malloc申请了一块地址通过free释放后的指针就是悬空指针此时这个指针跟野指针一样危险在后续程序如果还使用这个指针的话就会出现错误此时推荐在free后立刻给其赋值为NULL#include stdio.h #include stdlib.h int main(void) { int *p NULL; //创建的指针如果没确定好初值可以先赋值为NULL p malloc(100); //为其申请100个字节的内存 free(p); //释放这片内存此时p变成了悬空指针 p NULL; //为其设置为NULL,防止后续错误调用导致程序出问题 }总结就是在创建时为指针设为NULL,使用后也为其设为NULL这样就不容易出现问题