C语言中传值与传指针的介绍与区别

  


  

  

我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。

  


  

  

我们在初学C语言的时候就被老师教过,下面的方式是无法交换a和b的值的:

        # include   无效的交换(int, int b)   {   int temp=一个;   a=b;   b=temp;   printf("交换=% d、b=% d \ n”, a, b);   }   int主要(空白)   {   int=10;   int b=20;   printf("前交换:=% d, b=% d \ n ", a, b);   交换(a, b);   printf("互换:=% d后,b=% d \ n ", a, b);   返回0;   }      

运行结果如下:

  
  

之前交换:=10,b=20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  内部交换=20,b=10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  after 交换:=10,b=20
  

     

可以看的到,a和b的值最终并没有被交换。开始时,b的值为10,20,而最终还是同样的值。

  

为什么呢?因为函数参数在传递的时候,都是传原数据的副本,也就是说,交换内部使用的a和b只是最初始a和b的一个副本而已,所以无论在交换函数内部对a和b做任何改变,都不会影响初始的a和b的值。

  

正因如此,我们常常被告知,不要把直接把结构体直接作为参数,这样效率会很低,由于结构体本身占用字节数较大,如果直接作为参数,那么将会产生一个较大的“副本”,如此一来,效率也就很低了。

  

我们再结合下面的图来理解:

  

 C语言中传值与传指针的介绍与区别

  

首先图中方框中的上部分a和b代表了主要函数中的a和b,即原始数据,而方框中的下部分a和b代表了函数的参数a和b,即原始数据的“副”本。(后面的图都是如此,上部分代表原始值,下部分代表函数参数值)。

  

调用交换函数前后的情形如下:
  

  

 C语言中传值与传指针的介绍与区别

  

由于在交换中永远只是对a和b的副本进行操作,因此完全不影响原始的a和b的值。最终也不可能达到交换a和b的值的目的。

  


  

  

那么为解决上面的问题,我们知道,需要传指针。其代码如下:

        # include   无效的交换(int *, int * b)   {   int temp=*;   *=* b;   * b=temp;   printf("交换=% d、b=% d \ n”, *, * b);   }   int主要(空白)   {   int=10;   int b=20;   printf("前交换:=% d, b=% d \ n ", a, b);   交换(,,,b);   printf("互换:=% d后,b=% d \ n ", a, b);   返回0;   }      

运行结果:

  
  

之前交换:=10,b=20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

C语言中传值与传指针的介绍与区别