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。示意图如下:

  • 相关阅读:
    NTP on FreeBSD 12.1
    Set proxy server on FreeBSD 12.1
    win32 disk imager使用后u盘容量恢复
    How to install Google Chrome Browser on Kali Linux
    Set NTP Service and timezone on Kali Linux
    Set static IP address and DNS on FreeBSD
    github博客标题显示不了可能是标题包含 特殊符号比如 : (冒号)
    server certificate verification failed. CAfile: none CRLfile: none
    删除文件和目录(彻底的)
    如何在Curl中使用Socks5代理
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/5163280.html
Copyright © 2011-2022 走看看