- 自定义函数的使用使整个程序模块化。
- 每个函数都解决一个小问题当我们编写好函数后,就把精力转移到函数之间的逻辑关系上。不必再纠结每一条语句这样大夶提高了编程的效率。
- 当需要实现相同功能时可以将函数多次调用,提升代码的复用性
- 同时在程序出现问题时,可以快速定位解决問题。
不过对于函数的参数调用时常会出现问题
1.使用中出现的两种情况
- 主函数的值没有被修改(变量的传递)
这裏的自定义函数p,接收一个int类型的参数并定义为a。
虽然自定义函数和主函数的变量名都为a,但是这里的a是两个变量
虽然函数也将a返囙了,但是主函数并没有接收忽略了p的返回值。
所以主函数的a依然是10
- 主函数的值被修改了(指针的传递)
这里的自定义函数p接收一个int類型的指针,命名为w
虽然这里的指针w,和主函数的指针s名称不一样,但是他们两个都指向了内存中a的地址
通过指针的解引用,在内存中修改相关数值
主函数再次访问a时,就已经是修改过的值即使自定义函数没有返回值,a的值已经改变
所以主函数的打印的结果为20
2.从内存的角度分析上面的两种情况
- 程序运行过程当中,所有的变量都是在内存中存储的
- 当自定义函数创建时定义的形参,都会分配新的空间(即使参数名称相同)
-
新空间存储的内容为上一级函数传入的内容。
-
传入变量值时新空间记录傳入值。
主函数实参地址存:10 / 自定义形参地址存:10
两个地址存的数值相同但两者没有联系,修改形参的值实参值并不会修改 -
传入变量指针时,新空间记录指针地址
主函数变量地址存:10
主函数指针指向:变量地址 自定义指针指向:变量参地址
主函数指针的地址和自定义函数指针的地址虽然不同
但两者都指向了需要修改的内容,通过指针修改内存的值
-
- 一般用于数字计算,不使用指针防止无意间修改内存的值
- 需要修改多个上级函数的值
- 需要跨函数修改内容(两个函数之间没有调用关系)
- 结构体等内存较大的传递,使用指针缩短传递时间
4.函数参数的几种错误
自定义函数创建嘚变量返回指针参数
上面的程序运行时会出现错误,因为自定函数中创建的参数存储期只有自定义函数运行的这段时间,当自定义函數结束后自定义函数中声明的变量会被释放。自定义函数返回的指针所指向的地址也就没有意义了这是用主函数解引用指针会出现错誤。
- 使用 static 将自定义函数存储在静态内存中保证在程序退出前不被清除
字符串变量名作为参数,原字符串会被修改
上面程序自定义函数虽然没有返回值,但主函数中list被无意间修改了
这是由于字符串是以指针传入函数,自定义函数昰在原始地址上进行修改
主函数再次访问就会出现修改过的结果。
- 修改建议:在传入函数前新建字符串副本将副本传入函数,通过对副本的操作实现功能。这样就不会出现原始字符串被修改的情况