• 函数调用、值传递、引用传递、实参与形参


    1、有参函数需要虚实结合

    2、形参不占内存,实参占内存 (值在栈空间中,引用在堆空间中)

    3、如果在函数调用时是值传递如 c = max(a,b) a,b是一个值,值传递是单向传递,形参的改变不影响实参的改变

    4、如果 c = max(&a,&b),则会影响a,b的值

          如果 c = max(&a,b) ,则会影响a的值

          如果 c = max(a,&b) ,则会影响b的值

     例子:

    分析:

    实参:a,b 形参:x,y

    由于是值传递:x,y无论数值如何改变,都不会影响a,b的数值

     空间上:a,b,x,y都开辟了自己的空间存储值和地址的值

    int add(int a,int b){...}只会对返回值z产生影响,不会对a,b产生影响

     值传递的代码实现

    1. #include "stdio.h"
    2. #include "windows.h"
    3. #include "stdlib.h"
    4. //值传递
    5. int z;
    6. int main() {
    7. int a = 5;
    8. int b = 6;
    9. z = a - b;
    10. printf("z的值:%d\n", z);//打印z的值
    11. void swap(int x, int y);
    12. void printvalue(int i, int j);
    13. //没有交换a,b的值 a,b的值的作用域在main里 没有在swap中
    14. swap(a,b);
    15. printvalue(a, b);
    16. z = a - b;
    17. printf("main里z的值:%d\n", z);//打印main里z的值
    18. return 0;
    19. }
    20. //针对a,b值互换进行操作
    21. void swap(int x, int y) {
    22. int temp;
    23. temp = x;
    24. x = y;
    25. y = temp;
    26. z = x - y;
    27. printf("swap里z的值:%d\n", z);//打印swap里z的值
    28. }
    29. void printvalue(int i, int j) {
    30. printf("a=%d,b=%d\n", i, j);
    31. }
    32. //
    33. //z的值: - 1
    34. //swap里z的值:1
    35. //a = 5, b = 6
    36. //main里z的值: - 1
    37. //
    38. //从打印的结果显示,a,b传递进去后进行值交换只在swap(x,y)中起作用,回到main里a和b的值并没有改变

     //
    //z的值: - 1
    //swap里z的值:1
    //a = 5, b = 6
    //main里z的值: - 1
    //
    //从打印的结果显示,a,b传递进去后进行值交换只在swap(x,y)中起作用,回到main里a和b的值并没有改变
     

    引用传递的代码实现

    1. #include "stdio.h"
    2. #include "windows.h"
    3. #include "stdlib.h"
    4. //值传递
    5. int z;
    6. int main() {
    7. int a = 5;
    8. int b = 6;
    9. z = a - b;
    10. printf("z的值:%d\n", z);//*q取的是z的值
    11. void swap(int x, int y);
    12. void printvalue(int i, int j);
    13. //没有交换a,b的值 由地址指针指向不同的值 导致在输出时发现值是交换的
    14. swap(a,b);
    15. printvalue(a, b);
    16. z = a - b;
    17. printf("main里z的值:%d\n", z);//*q取的是z的值
    18. return 0;
    19. }
    20. //针对地址的指针进行操作
    21. void swap(int x, int y) {
    22. int temp;
    23. temp = x;
    24. x = y;
    25. y = temp;
    26. z = x - y;
    27. printf("swap里z的值:%d\n", z);//*q取的是z的值
    28. }
    29. void printvalue(int i, int j) {
    30. printf("a=%d,b=%d\n", i, j);
    31. }
    32. //
    33. //z的值: - 1
    34. //swap里z的值:1
    35. //a = 5, b = 6
    36. //main里z的值: - 1
    37. //
    38. //从打印的结果显示,a,b传递进去后进行值交换只在swap(x,y)中起作用,回到main里a和b的值并没有改变

     ​​​

  • 相关阅读:
    Linux 在多个文件中搜索关键字
    Markdown数学公式大全
    探索Scrapy中间件:自定义Selenium中间件实例解析
    git 提交规范化
    Git纯操作版 项目添加和提交、SSH keys添加、远程仓库控制、冲突解决、IDEA连接使用
    Linux:按时间批量删除文件(删除N天前文件)
    问题求解与实践-简单数值计算
    设计循环队列
    【C#】rdlc报表答应报错:未能加载文件或程序集“Microsoft.SqlServer.Types
    cloudera manager - Error while committing the transaction
  • 原文地址:https://blog.csdn.net/m0_51750419/article/details/127617359