关于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:调用的格式是相同的哦

      

    

   

原文地址:https://www.cnblogs.com/causal360/p/4756277.html