• C/C++中函数参数传递的三种情况(p *p &p)


     1 #include <stdio.h>
     2 void swap(int a,int b){
     3     int temp=a;
     4     a=b;
     5     b=temp;
     6 } 
     7 int main(){
     8     int a=1,b=2;
     9     swap(a,b);
    10     printf("%d %d",a,b);
    11     return 0;
    12 }

    方法一:

    以上这种做法不能交换两个数。

    这是因为函数在接受参数的过程中是单向一次性的值传递,即在调用swap(a,b)的时候将a  b的值传进去了,相当于传进去一个副本,对副本进行操作不会影响main函数中的a b的值。

     1 #include <stdio.h>
     2 void swap(int* a,int* b){
     3     int temp=*a;
     4     *a=*b;
     5     *b=temp;
     6 } 
     7 int main(){
     8     int a=1,b=2;
     9     int* p1=&a;//指针不初始化很危险
    10     int* p2=&b;
    11     swap(p1,p2);
    12     printf("%d %d
    ",a,b);
    13     printf("%d %d
    ",*p1,*p2); 
    14     return 0;
    15 }

    方法二:

    以上这种做法能交换两个数。

    因为指针变量存放的是地址,那么使用指针变量作为参数时传进来的也是地址。在上式中,把&a和&b 作为参数传递进去,在swap函数中指针a存放&a,指针b存放&b,实现了直接对地址中存放的数据进行操作,因此交换操作会改变main函数中a与b的值。

    只有在获取地址的情况下对地址指向的数据进行操作,才能真正地修改变量。

     1 #include <stdio.h>
     2 void swap(int* a,int* b){
     3     int *temp=a;
     4     a=b;
     5     b=temp;
     6 } 
     7 int main(){
     8     int a=1,b=2;
     9     int* p1=&a;
    10     int* p2=&b;
    11     printf("%d %d
    ",*p1,*p2);
    12     printf("%d %d
    ",&a,&b);
    13     swap(p1,p2);
    14     printf("%d %d
    ",*p1,*p2); 
    15     printf("%d %d
    ",&a,&b);
    16     return 0;
    17 }

    方法三:

    以上这种做法不能交换两个数。

    因为这种做法本质上和方法一一样,swap函数交换完地址之后main函数里的a和b的地址其实没有被交换。其实,main函数传给swap函数的“地址”是一个“无符号整数”,其本身也跟普通变量一样只是值传递

     1 #include <stdio.h>
     2 void swap(int &x,int &y){
     3     int temp=x;
     4     x=y;
     5     y=temp;
     6 } 
     7 int main(){
     8     int a=1,b=2;
     9     printf("%d %d
    ",a,b);
    10     swap(a,b);
    11     printf("%d %d
    ",a,b);
    12     return 0;
    13 }

    方法四:

    以上这种方法能交换两个数。

    使用C++中的“引用”,可以不产生副本,而是给原来的变量起一个别名。对引用变量的操作就是对原变量的操作,可以达到在函数中修改函数外部变量的效果。即在上式中x=a y=b,所以对x y进行修改其实也是对a b进行修改。

     1 #include <stdio.h>
     2 void swap(int* &x,int* &y){
     3     int* temp=x;
     4     x=y;
     5     y=temp;
     6 } 
     7 int main(){
     8     int a=1,b=2;
     9     int* p1=&a;
    10     int* p2=&b; 
    11     printf("%d %d
    ",*p1,*p2);
    12     printf("%d %d
    ",&a,&b);
    13     swap(p1,p2);
    14     printf("%d %d
    ",*p1,*p2);
    15     printf("%d %d
    ",&b,&a);
    16     return 0;
    17 }

    方法五:

    以上这种做法能交换两个数。

    因为对指针进行了引用,所以改变指针x y 就是改变指针p1 p2,即main函数中a b的地址互换了。程序运行见下图。

    作者:PennyXia
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    UITextField 获取焦点
    iphone自动隐藏和显示工具栏和导航条
    01maya基础
    Windows10开机自动运行批处理、脚本等的方法
    吉他自学
    设置博客园的博客,不允许选择和复制
    .net简单的静态页生成
    尚未配置为Web项目.指定的本地IIS URL http://localhsst/..要打开项目,需要配置虚拟目录 。是否立即创建虚拟目录 解决
    unity3d自带帮助文档的打开方法
    url重写步骤
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12346366.html
Copyright © 2020-2023  润新知