zoukankan      html  css  js  c++  java
  • C语言地址传递和值传递简析

    C语言没用引用传递,想用&引用传递,把。c改成。cpp,就能编译通过。 若参数传递的是简单数据类型的数值,则将其归类为值传递方式;若参数传递的是变量的地址,则视其为地址传递方式。 值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 下面我们用书上出现频率最高的一个程序来分别实现值传递过程和地址传递过程。

        void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("\n(swap):%d,%d\n",x,y);

        } void main() { int a,b; scanf("%d,%d",&a,&b);

        if(a<b) swap(a,b);

        printf("\n(main):%d,%d\n",a,b);

        }

        这显然是一个值传递的过程。假设我们从键盘输入两个数据:5,9,先来看一下运行结果:

        (swap):9,5 (main):5,9

        按照值传递的特点,我们可以很清楚的看到,虽然在swap函数中暂时使得运行结果显示了交换后的数据,即达到了交换的目的,但实际情况却是随着swap函数的结束,被作为局部参数的形参x,y以及swap函数本身的局部参数temp都将结束其生存期,在内存中的存储空间被释放。因此实参a,b的并未受到影响,依然保持原值。从这道程序中我们也可以学到一个方法,比如有时不需要修改实参,但是又需要被调函数所作的工作能够得以体现,就可以灵活的在被调函数中使用打印语句。因此上面的程序可以改写为:

        void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("\n从大到小排列的顺序为:%d,%d\n",x,y);

        } main() { int a,b; scanf("%d,%d",&a,&b);

        if(a<b) swap(a,b);

        }

        在输入5,9两个数字后,得到的执行结果是: 从大到小排列的顺序为:9,5 你看这样就可以使用相对容易理解的值传递方式,巧妙的解决问题了,并得到了想要的答案,虽然我们并未真正的让主函数中的两个变量发生改变。再来看地址传递方式:

        void swap(int *p,int *q) { int temp; temp=*p; *p=*q; *q=temp; } void main() { int a,b; int *pointer_1=&a,*pointer_2=& scanf("%d,%d",&a,&b);

        if(a<b) swap(a,b);

        printf("\n%d,%d\n",a,b);

        }

        假设我们从键盘输入两个数据:5,9,先来看一下运行结果: 9,5 在这个程序中用指针变量作参数,虽然传送的是变量的地址,但实参和形参之间的数据传递依然是单向的“值传递”,即调用函数不可能改变实参指针变量的值。但它不同于一般值传递的是,它可以通过指针间接访问的特点来改变指针变量所指变量的值,即最终达到了改变实参的目的。

  • 相关阅读:
    POJ 2018 二分
    873. Length of Longest Fibonacci Subsequence
    847. Shortest Path Visiting All Nodes
    838. Push Dominoes
    813. Largest Sum of Averages
    801. Minimum Swaps To Make Sequences Increasing
    790. Domino and Tromino Tiling
    764. Largest Plus Sign
    Weekly Contest 128
    746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/runnigwolf/p/2590873.html
Copyright © 2011-2022 走看看