C/C++中的值传递,引用传递,指针传递,指针引用传递

在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘。

1. 值传递 

 1 void f( int  p){
 2     printf("
%x",&p);
 3     printf("
%x",p);
 4     p=0xff;
 5 }
 6 void main()
 7 {
 8     int a=0x10;
 9     printf("
%x",&a);
10     printf("
%x
",a);
11     f(a);
12     printf("
%x
",a);
13 }

通过上例我们可以看到,int a=0x10,存放的地址为0x12ff44,值为10,当调用f(a)时,传递给p的值为10,但是p的地址为0x12fef4,当改变p=0xff,时是改变地址为0x12fef4中的内容,并没有改变0x12ff44中的内容,所以调用f(a),后a的值仍然为0x10,所以值传递无法改变变量的值。示意图如下:

2. 引用传递

 1 void f( int & p){
 2     printf("
%x",&p);
 3     printf("
%x",p);
 4     p=0xff;
 5 }
 6 void main()
 7 {
 8     int a=0x10;
 9     printf("
%x",&a);
10     printf("
%x
",a);
11     f(a);
12     printf("
%x
",a);
13 }

通过上面引用传递传递案例我们可以看到,调用f(a)时,传递给p的是a的地址,所以p和a的地址都是0X12ff44,所以p就是a,改变p当然能改变a。示意图如下:

3. 指针传递

 1 void f( int*p){
 2     printf("
%x",&p);
 3     printf("
%x",p);
 4     printf("
%x
",*p);
 5     *p=0xff;
 6 }
 7 void main()
 8 {
 9     int a=0x10;
10     printf("
%x",&a);
11     printf("
%x
",a);
12     f(&a);
13     printf("
%x
",a);
14 }

通过指针传递的案例我们可以看到,调用f(&a)是将a的地址0x12ff44传递给p,则*p就指向了a的内容,改变*p后,a的内容自然就改变了,示意图如下:

4. 指针的引用传递

 1 void f( int*&p){
 2     printf("
%x",&p);
 3     printf("
%x",p);
 4     printf("
%x
",*p);
 5     *p=0xff;
 6 }
 7 void main()
 8 {
 9     int a=0x10;
10     printf("
%x",&a);
11     printf("
%x
",a);
12     int *b=&a;
13     printf("
%x",&b);
14     printf("
%x",b);
15     printf("
%x
",*b);
16     f(b);
17     printf("
%x
",a);
18 }

为了使用指针的引用传递我们要新建一个指针b,然后将b的引用传递给p,其实p就是b的一个拷贝,*p=*b都指向a,所以改变*p的内容也就改变a的内容。示意图如下:

我们再来看一下如果不用指针的引用传递会出现什么结果

 1 void f( int*p){
 2     printf("
%x",&p);
 3     printf("
%x",p);
 4     printf("
%x
",*p);
 5     *p=0xff;
 6 }
 7 void main()
 8 {
 9     int a=0x10;
10     printf("
%x",&a);
11     printf("
%x
",a);
12     int *b=&a;
13     printf("
%x",&b);
14     printf("
%x",b);
15     printf("
%x
",*b);
16     f(b);
17     printf("
%x
",a);
18     printf("
%x
",b);
19 }

从结果中我们可以看到调用f(b)时,传递给p的是b的内容,但是&b,和&p是不一样的,虽然*p和*b都指向a。示意图如下:

原文地址:https://www.cnblogs.com/CheeseZH/p/5163280.html