zoukankan      html  css  js  c++  java
  • 传值

    #include <iostream>
    using namespace std ;
    void Swap(int x, int y) ;
    int main(void)
    {
                int a = 1 ;
                int b = 2 ;
                cout << "a = " << a << ", " << "b = " << b << endl ;
                Swap(a, b) ;
                cout << "a = " << a << ", " << "b = " << b << endl ;
                system("pause") ;
                return 0 ;
    }        

       

    一:值传递

    void Swap(int x, int y)

    {

                int temp = x ;

                x = y ;

                y = temp ;

    }

    输出结果:

    a = 1, b = 2

    a = 1, b = 2

    原因:Swap(int x, int y)函数采用值传递的方式,传入的实参实际上是a和b的副本而非其本身,所以对副本的改变并不会反应到a和b本身上。


    二:引用传递

    void Swap(int &x, int &y)

    {

                int temp = x ;

                x = y ;

                y = temp ;

    }

    输出结果:

    a = 1, b = 2

    a = 2, b = 1

    原因:Swap(int x, int y)函数采用引用传递的方式,传入的实参实际上是a和b的引用,对引用的改变会直接反应到a和b本身上。

     

    三:指针传递

    1.  改变指针本身

    void Swap(int *x, int *y)

    {

                int *temp = x ;

                x = y ;

                y = temp ;

    }

    调用方法:Swap(&a, &b) ;

    输出结果:

    a = 1, b = 2

    a = 1, b = 2

    原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参实际上是a和b的指针的副本,而且改变的是副本本身而非其间接引用,所以不会影响的指针所指向的值,即a和b本身上。

     

    2.  改变指针的间接引用

    void Swap(int *x, int *y)

    {

                int temp = *x ;

                *x = *y ;

                *y = temp ;

    }

    调用方法:Swap(&a, &b) ;

    输出结果:

    a = 1, b = 2

    a = 2, b = 1

    原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参虽然也是a和b的指针的副本,但是改变的是副本的间接引用,无论是指针本身还是其副本,都指向相同的值,所以这个改变会反应到a和b本身上。

    #include<stdio.h>
    #include<stdlib.h>
    void change(int **,int *);
    void change1(int , int );
    void change2(int &,int &);
    void main()
    {
            int i=3 , j=4;
            int *p1=&i;
            int *p2=&j;
            printf("change before *p1=%3d *p2=%3d ",*p1,*p2);
            change1(i,j);
            printf("change1  *p1=%3d *p2=%3d ",*p1,*p2);
            printf("change1  i  =%3d j  =%3d ",i,j);
            i=3 , j=4;
            change2(i,j);
            printf("change2 after i  =%3d j  =%3d ",i,j);
            i=3 , j=5;
            change(&p1,p2);
            printf("change after *p1=%3d *p2=%3d ",*p1,*p2);
            printf("change after i  =%3d j  =%3d ",i,j);       
            system("pause");
    }
    void change(int **a,int *b)  //传地址
    {
            **a = *b;
    }
    void change1(int a , int b)  //值传递
    {
            a=b;
    }
    void change2(int &a,int &b)  //引用,传本身
    {
            a=b;
    }

    C语言在传值过程中,如果要对传入的数据进行修改,就必须传入要修改操作的变量的地址;数组传值弱化为指针,所以数组名就相当于数组地址。

  • 相关阅读:
    一名菜鸟程序员的跳槽经历以及其所感所想(二)
    C#调用WebService
    IIS Error:404.2 The page you are requesting cannot be served because of the ISAPI and CGI Restriction list settings on the Web server
    C#操作XML简析系列(1)之增删修改查
    The web server process that was being debugged has been terminated by Internet Information Services (IIS).
    一名菜鸟程序员的跳槽经历以及其所感所想(一)
    访问WebService出现IIS错误:The request failed with HTTP status 401: Unauthorized
    Windows2008服务器搭建Apollo_MQTT服务
    [ObjC笔记] "self = [super init]"的解释与潜藏bug
    [LBS]查询离某个经纬附近的数据SQL语句
  • 原文地址:https://www.cnblogs.com/meihao1203/p/8023445.html
Copyright © 2011-2022 走看看