一、指针的定义1.本质指针就是存储地址值的变量。我们设计一个地址类型的变量用来存放其他变量的内存地址2.指针的大小1.指针占多少字节取决于CPU架构x86架构32位指针大小为4字节x64架构64位指针大小为8字节2.在内存分配上Windows通常是用户2G内核2GLinux是用户3G内核1G3.指针的三种初始形态野指针悬挂指针int* p;//定义但未初始化空指针int* pNULL;//安全的初始化方式无类型指针void* pval;//可以接受任意类型变量的地址。注意void*不能进行解引用也不能进行算术运算。二、const的用法常量不能被修改也不能取地址常变量具有常性值不能修改但可以取地址const修饰变量时会使其具有“常性”const double PI3.14; const double* pPI;//const限定*p具有常性即p指向的值不允许通过p修改 double * const qval;//p本身具有常性即不允许修改p的指向 const double* const snum;//指针自身和指针指向的值都具有常性不允许被修改当const修饰指针是看类型自右向左看权限只能缩小不能放大const int val0; int* pval;//error!左边类型是int*右边是const int* int val0; const int * pval;//✅️三、指针运算1.指针的类型决定了解引用--解析的内存大小egint* p //*p解析的内存大小为int大小int** q //*q解析的内存大小为int*大小指针1能力步长int arr[] {1, 2, 3, 4, 5}; int* p arr; *(p1); // 访问第2个元素 // 本质数组下标 arr[1] 完全等价于 *(arr 1)2.指针的加减法则可以相减同一内存空间的两个指针可以相减结果是这两个指针之间相隔的元素个数不可以相加3.mem系列函数stdlib.hmemset:逐字节进行初始化内存如memset(arr,0,sizeof(arr))memcpy内存拷贝但不处理内存重叠区域memmove内存拷贝能够安全处理内存重叠的情况四、指针数组和数组指针1.指针数组是一个数组里面的每个元素是指针int a,b,c; int* crr[]{a,b,c}; const char* strs[3] {hello, world, sta};// strs 是一个数组包含 3 个 const char* 类型的指针2.数组指针是一个指针指向一个完整的数组int arr[3]; int (*p)[3] arr; // 注意不能写 int *p[3]那是指针数组 // p 的类型是 int(*)[3]它指向一个占 12 字节3个int的数组五、指针与函数1.静态局部变量在函数中使用static修饰局部变量可以延长局部变量的生命周期使函数返回后变量依然存在保持上一次调用的值。2.传址调用指针做函数参数作用1.在函数内部修改外部的实参void Swap(int* pa, int* pb) //通过传址地址和解引用真正交换了外部变量的值2.节省内存空间3.输出型函数有时候函数不仅需要返回执行状态成功/失败还需要返回“计算结果”。此时可以用返回值传状态用指针参数带出结果// 除法函数设计 bool div(int a, int b, int* pval) { if (b 0) return false; // 状态除数为0失败 *pval a / b; // 结果通过指针写回 return true; // 状态成功 } // 调用int res; if(div(10, 2, res)) { ... }