)
一、指针补充1. 定义多个指针变量int*p;// 定义一个指针变量 pint*p,*q,*r;// 一次定义多个指针变量// * 是起修饰作用修饰变量名表示该变量是指针类型变量而不是普通变量inta,b,c,*p,*q;// 普通变量和指针变量可以混合定义注意定义时*是修饰用来说明是指针变量不是在取值2. 野指针野指针指针指向不明确。a. 指针变量未初始化——变量中可能是随机值 → 指针指向不明确野指针。int*p;// 野指针p 里是随机值不知道指向哪里3. NULL —— 空地址0号地址为了避免野指针定义指针时先赋 NULLint*pNULL;// 表示 p 的指向是明确的空地址 0号地址NULL 就是 0 号地址空地址判断指针是否有效if (p NULL) { ... }。4. void* —— 万能指针void// 空类型void*// 空类型指针 —— 万能指针可以接收任意类型的地址inta10;void*pa;// void* 可以指向任意类型5. 与 * 互为逆运算inta10;int*pa;*p// 等价于 (*p) p// 与 * 互为逆运算先解引用再取地址等于 p 本身二、排序指针版思路1. 选择排序思想给合适的位置选择合适的数。// 迭代的方式实现// begin —— 起始位置指针// end —— 结束位置指针for()// 用地址代表元素的位置条件 begin end{for(pbegin1;pend;){if()// p 位置上的值和 begin 位置上的值比较{swap();// 交换}}}voidselectArray(int*begin,int*end){int*pNULL;for(begin;beginend;begin){for(pbegin1;pend;p){if(*p*begin){intt*p;*p*begin;*begint;}}}}2. 冒泡排序思想相邻两个元素两两相比小的放前大的放后。for()// 控制趟数 —— 每一趟结束冒出一个数最大值冒到最后{for(?)// 一趟的比较过程从开头到结束位置{if()// 相邻比较{swap();// 交换}}}voidmp(int*begin,int*end){int*pNULL;int*bbegin;int*eend;for(begin;begine;begin,--end){for(pb;pend;p){if(*(p1)*p){intt*(p1);*(p1)*p;*pt;}}}}3. 插入排序思想从无序区拿数据插入到有序区。步骤① 拿数 ② 找位置 ③ 插入。for()// 通过指针拿数begin 起始位置{// 1. t 拿数// 2. int *q 准备要插入的位置while(qbegin*(q-1)t)// 前面的数比 t 大就往后挪{}*qt;// 插入到正确位置}voidcr(int*begin,int*end){int*pbegin;int*qNULL;for(pbegin;pend;p){intt*p;qp;while(qbegin*(q-1)t){*q*(q-1);--q;}*qt;}}三、查找二分查找指针版begin end// 0 1 2 3 4 5 6// b e// 1 2 3 4 5 6 8midbegin(end-begin)/2;// 中间位置if(*midn)// 要找的比中间小 → 去前半段{endmid-1;}elseif(*midn)// 要找的比中间大 → 去后半段{beginmid1;}else// 找到了{}返回值midint*—— 找到了返回位置指针NULL—— 空指针没找到。int*binaryFind(int*begin,int*end,intn){int*midNULL;int*retNULL;while(beginend){int*midbegin(end-begin)/2;if(*midn){endmid-1;}elseif(*midn){beginmid1;}else{retmid;break;}}returnret;}四、快速排序用到的知识① 指针 ② 递归 ③ 迭代思想分而治之——选一个基准值把比它小的放左边、比它大的放右边然后对左右两部分递归。voidquickSort(int*begin,int*end){int*pbegin;int*qend;//1.找基准值首元素int*kbegin;if(beginend)//7.递归结束的条件当begin与end错开或者相遇{return;}while(beginend)//5.{//2.从右往左找到第一个比基准值小的while(beginend*end*k){--end;}//3.从左往右找第一个比基准值大while(beginend*begin*k){begin;}//4.找到以后交换这两个值2和3的swap(begin,end);//5.重复2~4,直到begin与end相遇}//6.将相遇位置上的值与基准值交换swap(begin,k);//7.递归下去quickSort(p,end-1);//小的一部分quickSort(begin1,q);//大的一部分}五、小结指针操作整型一维数组指针很灵活指针可以代表位置指针也可以实现间接访问。六、指针操作字符型一维数组字符串本身也是按照字符型一维数组的方式存储到计算机中——字符串是一种特殊的字符型一维数组。chars[]hello;// 操作字符串指针操作 s 中的数据只需要获得首元素地址s[0]// char 类型s[0]// char *char*ps[0];// p 指向首元素s;// 数组名就是首元素地址等价写法七、const 修饰符const表示将所修饰的变量限定为只读。修饰原则就近原则——离谁近就限定谁。inta;// 普通变量可读可写constinta;// a 此时只读不能修改constchar*p;// 限定通过 *p 方式访问基类型为只读*p 不能修改基类型charconst*p;// 同上等价写法char*constp;// 限定 p 本身为只读p 不能被修改不能换指向constchar*constp;// p 不能被修改*p 也不能被修改const 在函数参数中的应用intputs(constchar*s);// const char *s —— 设计函数的一种方式puts 函数功能是把 s 中的字符串输出。建议如果函数只是做读操作参数建议写成 const 形式好处避免出问题出问题也能及早发现提高参数的适用性。能传什么给const char *参数char*// 指针数组名// 如 shello// 字符串常量constchar*// 常量指针八、表示字符串的两种方式chars[]hello;// 使用栈空间上的字符串可修改char*shello;// 使用字符串常量区中的字符串不可修改constchar*shello;// 更准确的写法明确告知是只读的字符串常量九、strcpy 的 const 版本char*strcpy(char*dest,char*src);// 普通写法char*strcpy(char*dest,constchar*src);// 改进src 只读不修改原因strcpy 只读 src 的内容不改 src所以 src 用const char *更安全。补充总结int *p,*q,*r;中*是修饰作用野指针 指针指向不明确未初始化NULL用来避免野指针void *万能指针与*互为逆运算*p p三种排序选择/冒泡/插入、二分查找都可以用指针begin/end/mid实现快速排序 指针 递归 分而治之const 就近原则只读函数参数用const char *字符串两种表示栈空间可改vs 字符串常量区只读。