
补充1.如果定义多个指针变量int *p,*q,*r; // p、q、r全部都是int指针 int a,b,c,*p,*q; // a,b是普通整型变量p,q才是指针int *p;这里的 * 是修饰符修饰后面的变量p代表p是指针变量。存放int类型变量的地址。*p a;这里的 * 是运算符取地址运算。2.野指针指针变量未初始化变量中是随机值指针没有明确的指向3.NULL空地址为了避免野指针定义指针时在没有确定指向的时候赋值为NULL。int *p NULL4.void * 空类型指针万能指针一、指针中的排序和查找算法1.选择排序void selectSort(int *begin, int *end) { int *p; for (; begin end; begin) { for(p begin1; p end; p) { if(*p *begin) { swap(p, begin); } } } }2.冒泡排序void bubbleSort(int *begin, int *end) { int *p; for (end; end begin; --end) { for(p begin; p end; p) { if(*(p1) *p) { swap(p1, p); } } } }3.插入排序void insertSort(int *begin, int *end) { int *p begin; int *q NULL; for (; p end; p) { int t *p; q p; while (q begin *(q-1) t) { *q *(q-1); --q; } *q t; } }4.快速排序分治法步骤1.选择基准值2.从右往左找到第一个比基准值小的值标记为end3.从左往右找到第一个比基准值大的值标记为begin4.交换end标记的值和begin标记的值5.重复2~4直到end和begin相遇6.相遇时将相遇位置上的值和基准位置上的值交换7.比基准值小的部分和比基准值大的部分分别继续重复1~7递归void quickSort(int *begin, int *end) { //递归结束条件 if (begin end) { return; } //记录初始位置 int *p begin; int *q end; //1.确认基准值首元素 int *k begin; while(begin end)//5.判断end和begin是否相遇 { //2.从右向左遍历找到第一个比基准值大的值标记为end while (*k *end end begin) { --end; } //3.从左向右遍历找到第一个比基准值小的值标记为begin while (*k *begin end begin) { begin; } //4.交换end和begin标记的值 swap(begin, end); //重复 } //将end和begin相遇时的值和基准值进行交换左边都是比基准值小的值右边都是比基准值大的值 swap(begin, k); //在比基准值小的部分继续进行快速排序 quickSort(p, end-1); //在比基准值大的部分继续进行快速排序 quickSort(begin1, q); }5.二分查找int *binaryFind(int *begin, int *end, int n) { int *mid; while (begin end) { mid begin (end - begin)/2; if (*mid n) { end mid - 1; }else if (*mid n) { begin mid 1; }else { break; } } if (end begin) { return NULL; }else { return mid; } } //递归 int * binaryFindR(int *begin, int *end, int n) { if(begin end) { return NULL; } int *mid begin (end - begin)/2; if (*mid n) { end mid - 1; return binaryFindR(begin, end, n); }else if (*mid n) { begin mid 1; return binaryFindR(begin, end, n); }else { return mid; } }二、指针操作字符型数组char s[] hello; //操作字符串字符串是一种特殊的字符型一维数组末尾带\0结束标记。指针操作s中的数据需要获得首元素地址s[0] //char类型 s[0] //char * char *p s;//等价于char *p s[0];const和指针int puts(const char *s);const表示将所修饰的变量限定为只读遵循就近原则 离谁近就限定谁。如果函数只是读取字符串 / 数组数据不修改内容参数就加const。好处编译阶段就能发现非法修改兼容性更强可以接收 char*、数组名、字符串常量提高函数的适用性。const int a; //这个a此时只读 const char * p; //限定通过*p方式访问基类型 为 只读 不能修改基类型 char const * p; //限定通过*p方式访问基类型 为 只读 char * const p; //限定p本身为只读 表示p本身不能被修改 const char * const p; //p不能被修改 *p也不能被修改表示字符串的方式char s[] hello; //使用栈空间上的 字符串 char *s hello; //使用字符串常量区中字符串 const char *s hello; //更准确char *strcpy(char *dest, char *src); char *strcpy(char *dest, const char *src);目标地址 dest 内容需要修改不加 const源字符串 src 只读取添加 const 保护。三、总结指针可以直接操作内存地址配合数组、字符串、排序算法一起使用是入门阶段最大的难点。很多人觉得指针难本质是它非常抽象还能和前面学的变量、数组、函数全部串联起来。对于函数的这一块取地址和取值运算还要继续加强。明天是国庆节国庆节快乐