这篇笔记整理了指针的核心概念、运算、与const的结合、数组的关系以及函数中的应用帮你彻底搞懂指针。一、指针的基本定义指针本质上就是地址的别名。- 指针是一个变量存储的是另一个变量的内存地址。- 地址本身是一个常量值不可以被修改。int val 0; int* p val; // p是指针存储了val的地址 const int** p q; // 通过解引用操作符*修改val的值const int* pval;限定了p指向的值具有常性。int* const p;限定p的指向具有常性。指针与const的结合const 与指针的组合有三种常见情况需要分清限制的是指针本身还是它指向的值1. 指向const的指针 const int* p val;- 限制不能通过 *p 修改指向的值。- 允许指针 p 本身可以指向其他地址。2. const指针 int* const p val;- 限制指针 p 本身的地址不能改变一旦初始化就不能再指向别处。- 允许可以通过 *p 修改指向的值。3. 指向const的const指针 const int* const p val;- 限制指针本身和它指向的值都不能被修改。二、指针运算指针运算的核心是指针加减整型它的本质是“指针向前/向后移动N个指向类型的内存单元前提两个指针必须指向同一个连续空间。- p1 指针向前移动 sizeof(*p) 个字节。- p 指针自增指向下一个内存单元。- p1-p2 两个同类型指针相减得到它们之间相差的元素个数不是字节数。ElemType arr[5]; ElemType *parr; p1; //表示指针向高内存便宜了一个ElemType的类型长度最终结果就是arr[1] //p1只计算了指针的新地址而不会修改指针p本身 *p1; //这里进行了两步操作 //step1:对p进行解引用 //step2:对解引用的值加一 //比如arr[0]的值是0进行操作后值为1同样不会改变arr[0]和p本身依然在这个数组内如何通过指针p将第四个元素修改为61.直接偏移*p36;指针p偏移了3个ElemType长度指向arr[3].2.使用强制类型转换*int*int*p36先将p强制转换为int*类型然后再对p进行3个单位的偏移最后再进行一步解引用操作如何来理解这几步操作我们知道计算机内存的最小单位是字节但指针偏移的步长并不是固定的一字节而是由指针本身的类型来决定的我们再回到语句本身原来的P是ElemType*,转换后则是int*,而int*本身是四个字节的步长这一步就已经改变了指针p的偏移规则等于是告诉编译器接下来要把p按照int类型来计算第二步转换后3表示3*sizeof(int)12Byte,刚好指向原数组的第四个元素。三、指针与数组指针和数组关系紧密但它们不是同一个东西。数组指针 vs 指针数组这是面试高频考点一定要分清首先区分两个概念————指针数组VS数组指针1.指针数组指针数组的本质其实还是一个数组但这个数组里每一个元素存储的都是指针。2.数组指针本质还是一个指针只是这个指针指向了一个完整的数组int arr[5]; int(*p)[5] arr; //p指向了整个数组arr //在使用的时候首先解引用p得到数组arr然后才能访问数组里的元素四、指针与函数指针在函数中主要有两种角色作为参数和作为返回值。1. 函数参数指针传递当我们需要在函数内部修改函数外部变量的值时就需要传递变量的地址指针。void swap(int* a, int* b) { int temp *a; *a *b; *b temp; } int main() { int x 1, y 2; swap(x, y); // 传递x和y的地址 // 现在x2, y1 }2. 函数返回值返回指针函数可以返回一个指针但绝对不能返回局部变量的地址因为局部变量在函数结束后会被销毁地址会变成野指针。- 安全的返回值全局变量的地址、静态局部变量的地址、动态分配内存的地址、传入参数的地址。// 安全返回静态局部变量的地址 int* fun() { static int val 10; return val; }五、常用字符串与内存操作函数字符串函数 ( string.h )- strlen(str) 计算字符串有效长度不包括末尾的 \0 。- strcpy(dest, src) 将 src 字符串拷贝到 dest 。注意要确保 dest 有足够空间否则会导致缓冲区溢出。- strcat(dest, src) 将 src 字符串连接到 dest 的末尾。- strcmp(str1, str2) 按字典序比较两个字符串。- strstr(str, substr) 在 str 中查找 substr 子串首次出现的位置。- strtok(str, delim) 使用 delim 作为分隔符将字符串 str 分割成多个片段。内存操作函数 ( string.h )这些函数操作的是内存块不关心数据类型- memset(ptr, value, num) 将 ptr 指向的内存块前 num 个字节全部设置为 value 。常用于初始化。- memcpy(dest, src, num) 从 src 拷贝 num 个字节到 dest 。- memmove(dest, src, num) 功能同 memcpy 但可以安全地处理内存区域重叠的情况。- memcmp(ptr1, ptr2, num) 比较两个内存块的前 num 个字节。