19.04.16--指针笔记-参数传递
指针和参数
1、形参改变不了实参的值:图1
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416203116824-896952932.png)
图1
2、通过地址传递可以改变实参的值:图2
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416203150120-198099907.png)
注意:在图1与图2 在定义函数参数中 a,b前 星号 * 的有无 说明传递的是 实参的地址与实参的值
2、函数参数中如果有数组 都会转化为指针 sizeof(数据类型) 所以求出来的值不作为循环的值使用
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416203249116-1388607500.png)
打印结果
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416203257735-1810241790.png)
注意:数组作为函数参数可以退化为指针(图3)
在传递数组时需要加上数组的个数
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416203322735-2078664506.png)
图3
3、两种方式求出字符串长度 (图4)
①利用函数strlen();
②通过while循环遍历字符串直至遇到字符串结果\0结束,遍历中定义一个整型变量i,进行记录循环次数,同时也是字符串长度;
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416203342609-1060402345.png)
4、指针作为返回值
①字符串数组 存放在栈区:图5
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416203414140-1734217805.png)
图5
②字符串常量 会在程序运行时 放在常量区 不能被修改 可以读取 程序结束时会被销毁:图6
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416204854981-306263389.png)
图6
③保证指针地址对应的值是有内容的:图7
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416204919156-598329792.png)
图7
5、strstr例子:
条件:①两个匹配的字符串,必须完全匹配,匹配个数 = 字符串长度
②如果匹配一个字符串,需要记录被匹配字符串地址
③如果匹配一半为成功 回到记录被匹配字符串地址+1
④如果匹配中的被匹配字符串的结束 匹配个数 不等于 字符串长度
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210205140-1026215011.png)
6、指针和字符串
①*p改变字符串中的值
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210341478-1910616601.png)
②字符串与指针在程序中打印的值:
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210437333-269281936.png)
③字符串常量 是一个常量的数组 可以读取字符和字符串 但是不能修改
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210511483-1621086173.png)
④栈区
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210544795-831619949.png)
⑤常量区
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210557629-1152979820.png)
7、指针小结
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210615794-2088836063.png)
二级指针小结
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210636073-1665503188.png)
注意:不是所有的二级之指针都能当作二维数组来操作
所有的二维数组都能当作二维指针来使用
8、字符串排序的三种实现方法:
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210658693-587711786.png)
循环优化
定义一个int类型 初始化为1;
在第二层循环的交换语句的开始 将定义的int类型的flag 赋值为零,开始内层循环结束,判断flag是否为零,如果为零直接return,
否则在外层循环再将flag赋值为1,再次进行内循环,直至执行flag判断的语句;
![](https://img2018.cnblogs.com/blog/1648974/201904/1648974-20190416210728536-1939940236.png)