• 关于C语言 值传递和址传递的思考


    我觉得我们首先的明确几个概念然后再去理

    1. 首先标准的C语言中没有引用传参,而只有传值传参和地址传参俩种。但现在由于编译器的不同以及对C++的兼容导致可以进行引用传值


    找来了网上讨论的几个的例子

     

    void Exchg1(int x, int y)
    {
       int tmp;
       tmp = x;
       x = y;
       y = tmp;
       printf("x = %d, y = %d
    ", x, y);                            
    }
    main()
    {
       int a = 4,b = 6;
       Exchg1(a, b);
       printf("a = %d, b = %d
    ", a, b);
       return(0);
    }

     

    当然有时候我们为了看的更清楚也可以这么测试

    #include "stdio.h" 
    
    void Exchg2(int *px, int *py)
    {
        printf("px =%p......py=%p
    ",px,py);
        int tmp=*px;
       *px=*py;
       *py=tmp;
        printf("px =%p......py=%p
    ",px,py);
        printf("*px=%d,*py=%d
    ",*px,*py);
    }
    int main() {
    
         int a=4;
          int b=6;
          printf("交换前&a = %p,&b=%p
    ",&a,&b);
          Exchg2(&a,&b);
          printf("交换后&a = %p,&b=%p
    ",&a,&b);
          printf("a=%d,b=%d
    ", a, b);
        return 0;
    }

    例子2.

    #include "stdio.h" 
    
    void Exchg2(int *px, int *py)
    {
       int tmp = *px;
       *px = *py;
       *py = tmp;
       printf("*px = %d, *py = %d.
    ", *px, *py);
    }
    int main()                                        
    {
       int a = 4;
       int b = 6;
       Exchg2(&a, &b);
       printf("a = %d, b = %d.
    ", a, b);
       return(0);
    }

    例子3(ps:在最开始时候我们已经说过了 C语言是没有引用传递的所以这个例子你可以在X.cpp中运行)

    #include "stdafx.h"
    
    void Exchg3(int &x, int &y)
    {
        int tmp = x;
        x = y;
        y = tmp;
        printf("x = %d,y = %d
    ", x, y);
    }                                              
    int main()
    {
        int a = 4;
        int b = 6;
        Exchg3(a, b);
        printf("a = %d, b = %d
    ", a, b);
        return 0;
    }

    我们对第1个例子进行一下分析

        

    Exchg1(a, b)时所完成的操作代码如下所示。
    int x = a; /* ← 注意这里,头两行是调用函数时的隐含操作 */
    int y = b; /* ← 注意这里,头两行是调用函数时的隐含操作 *///典型的做交换的代码
        int tmp;
        tmp = x;
        x = y;
        y = tmp;
    }

    这个函数之中只是对 传进来的两个参数做了一次交换操作,必然和实参没有半毛钱的关系。


     

    void Exchg2(int *px, int *py)
    {
         int *px = &a;  /* ← 注意这里,头两行是调用函数时的隐含操作 */
         int *py = &b;  /* ← 注意这里,头两行是调用函数时的隐含操作 */
        
         int tmp = *px;    /* ← 交换操作,只不过这次交换的地址 */
         *px = *py;
         *py = tmp;
         printf("*px = %d, *py = %d.
    ", *px, *py);
    }

    做一些函数里边隐含操作的可以更方便的理解函数,这个其实和上边差不多,只是隐含操作从  int px = a    →  int *px = &a;

    如果懂得基本原理我想我是没有必要讲解一下去了。


    在第三个例子中我们会发现和第二个例子出现的结果是一样。它的原理其实和第二个是相同的。这样函数里头操作的其实就是实参a、b本身了,也就是说函数里是可以直接修改到a、b的值了。

    结论:

      值传递在定义处是:Exchg1(int x, int y);
      引用传递在这义处是:Exchg3(int &x, int &y);  

         

      值传递:Exchg1(a, b);
      引用传递:Exchg3(a, b); (ps:调用的格式是相同的哦

          

        

       

  • 相关阅读:
    第四次上机作业
    第十一周作业
    Java第九次上机作业
    Java第八次上机作业
    Java第七次上机作业
    第八周作业
    Java第六次上机作业
    第七周作业
    Java第五次上机作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/causal360/p/4756277.html
Copyright © 2020-2023  润新知