zoukankan      html  css  js  c++  java
  • 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。示意图如下:

  • 相关阅读:
    备忘录 | ‘神器’在手,新世界大门我有
    1001种玩法 | HotswapAgent:支持无限次重定义运行时类与资源
    面面观 | CentOS install etcd 测试
    控制台、终端、虚拟终端和伪终端
    KMP算法,BoyerMoore算法
    qemu kvm 虚拟化
    web端log4net输出错误日志到mysql
    JQuery调用WCF服务,部署在iis
    首篇
    微信支付接口
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/5163280.html
Copyright © 2011-2022 走看看