精华内容
下载资源
问答
  • 一般来说C++中参数传递有三种方式:值传递、指针传递、引用传递 1.值传递——传值 值传递是最常见的一种参数传递的方式,但是对初学者来说也最容易出错。如下例: #include<iostream.h> void fun(int a,int...

    一般来说C++中参数传递有三种方式:值传递、指针传递、引用传递

    1.值传递——传值

    值传递是最常见的一种参数传递的方式,但是对初学者来说也最容易出错。如下例:

    #include<iostream.h>
    void fun(int a,int b)
    {
    	int temp;
    	temp=a;
    	a=b;
    	b=temp;
    }
    void main()
    {
    	int m,n;
    	m=1;
    	n=2;
    	fun(m,n);
    	cout<<m<<""<<n<<endl;		//输出结果为 12
    }

    例子中fun()函数采用值传递的方式,传入的实参实际上是m、n的副本而非其本身,所以对副本的改变并不会反映到m、n本身上。

    2.指针传递——传指针

    使用指针传递需要先了解一下指针的有关概念,因为这里主要介绍关于参数的部分,所以废话不多说了,直接看例子:

    #include<iostream.h>
    void fun(int * x)
    {
    	*x+=10;
    }
    void main()
    {
    	int n=0;
    	fun(&n);
    	cout<<n<<endl;		//输出结果为 10
    }

    fun()函数体内的x是指向外部变量n的指针,改变指针的内容将导致n的值得改变,所以n的值成为了10。

    3.引用传递——传引用

    引用相当于别名(绰号),比方说有人的名字是王小丽,她的绰号是“小小”。如果有人说“小小”几岁,实际上就是指王小丽几岁。

    #include <iostream.h>
    void main()
    {
    	int x;
    	int &y=x;	//变量引用
    	y=99;
    	cout<<"x="<<x<<endl;	//输出结果为 x=99
    }

    程序中&y=x应当理解为y具有x的地址,即x与y具有相同的地址,地址相同了当然内容也相同了,所以y的值是99。
    比较:

           对比参数的三种传递方式,可以发现“引用传递”和“指针传递”的性质一样,而书写方式像“值传递”。引用传递可以做的任何事指针也能够做到,因为指针能够毫无约束地操作内存中的东西,这种强大的功能背后也必将隐藏着巨大的危险,所以慎用指针。

     

    转载于:https://www.cnblogs.com/wangjingna/p/3763591.html

    展开全文
  • c++参数传递的三种方式 1、按值调用: 形如 int fun(int x) 2、指针调用:形如 int fun(int* p) 3、引址调用:形如 int fun(int &x) 或者 int fun(const int &x)

        在《数据结构与算法分析 C++描述》第16页提到了C++中三种不同的参数传递方式,分别是:1、按常量引用调用(call by constant reference2、按值调用 3、引址调用(call by reference)。上网查了下资料之后我还是觉得分成这样三种更便于理解:

    1、按值调用: 形如 int fun(int x)

    2、指针调用:形如 int fun(int* p)

    3、引址调用:形如 int fun(int &x) 或者 int fun(const int &x)

       按值调用存在实参的复制开销,要是有返回值又要复制一次。所以对于比较复杂的类类型实参,按值调用的复制开销是很大的。由于函数fun会对实参x复制之后再进行处理,所以按值调用的函数不管怎么处理都不会改变实参的值。

    #include <iostream>
    using namespace std;
    int fun(int x)
    {
    	x=100;
    	return 0;
    }
    void main()
    {
    	int a=1;
    	int b=fun(a);
    	cout<<"a="<<a<<endl;
    }

    输出结果是:a=1


        指针调用有人说指针调用是一种按值调用,也可以这样理解吧。这是因为函数的形参是指针,所以函数复制的也就是指针。fun函数对指针进行处理的时候也就直接对实参指针指向的对象进行了处理,所以按指针调用的函数会修改实参对象。

    #include <iostream>
    using namespace std;
    int fun(int* p)
    {
    	*p=100;
    	return 0;
    }
    void main()
    {
    	int a=1;
    	int *p=&a;
    	int b=fun(p);
    	cout<<"a="<<*p<<endl;
    }

    输出结果:a=100


        引址调用我们知道引用是独占的,即一旦创建了引用并初始化为某特定对象,它将总是引用此对象,给引用赋值并不会使它“指向”另外的对象,只是改变了对象的值。所以没有加const修饰的引址调用函数可以改变实参的值,比如:int fun(int &x),但是在进入函数和离开函数的时候没有发生复制。如果在形参类型之前再加上const则称为按“常量引用调用”这时函数只能读取实参的值而不可以改变它,例如:int fun(const int &x)。

    #include <iostream>
    using namespace std;
    int fun(int &x)
    {
    	x=100;
    	return 0;
    }
    void main()
    {
    	int a=1;
    	int b=fun(a);
    	cout<<"a="<<a<<endl;
    }
    输出结果:a=100

    如果在fun(int &x)形参类型之前加上const,在编译时会发生如下错误:



     

    展开全文
  • 习惯上大家把参数传递分为三种方式,但是从本质上来说,值传递和地址传递是一种,都是“传值方式”,只不过地址传递的值是一个地址罢了。引用传递才算是真正意义上的“地址传递方式”。 第二种地址传递方式是一般...

    目录

    写在最前

    一、【值传递】---将变量名作为实参和形参

    二、【地址传递】或叫【指针传递】---传递变量的地址

    三、【引用传递】---真正的传址方式


    写在最前

    习惯上大家把参数传递分为三种方式,但是从本质上来说,值传递和地址传递是一种,都是“传值方式”,只不过地址传递的值是一个地址罢了。引用传递才算是真正意义上的“地址传递方式”。

    第二种地址传递方式是一般不用的,需要修改实参,我们就用引用传递,不需要修改,就直接值传递。

     安利一下我的另外两篇与此内容相关的博客,一起食用效果更佳。     

            简单清晰的理解c++指针    https://blog.csdn.net/qq_21989927/article/details/107441621

            C++实现swap功能的常见方式和常见的几种错误  https://blog.csdn.net/qq_21989927/article/details/107445722

    一、【值传递】---将变量名作为实参和形参

    形式参数和实际参数:形参是函数定义时括号中的变量,实参是调用函数时用到的实际变量。

    #include<iostream> 
    using namespace std;
    
    void Find(int x){
    	x=x+100;
    	cout<<x<<" "<<&x<<endl;
    }
    
    int main(){	
    	int a=5;
    	cout<<a<<" "<<&a<<endl;
    	Find(a);
    	cout<<a<<" "<<&a<<endl; 
    } 

    结果:

    可以发现,形参x的值的改变,并不会影响实参a的值,并且x的地址和a是不一样的,在调用函数时x获得了地址分配,也就说说形参和实参不是同一个存储单元。

    1.在定义函数时指定的形参,在未出现函数调用时,他们并不占内存 中的存储单元,因此称他们为形式参数或者虚拟参数,表示他们并不是实际存在的数据,只有发生函数调用时,形参才被分配内存,以便接收来自实参传来的数据,在调用结束后,形参所占用的内存单元会被释放。

    2.实参变量对形参变量的数据传递是“值传递”,即为单向传递,只能由实参传递给形参,而不能由形参传回实参。

    3.值传递和指针传递,传递的都是实参的一份拷贝。

     

    二、【地址传递】或叫【指针传递】---传递变量的地址

    经典例题:交换两个数字

    #include <iostream>
    using namespace std;
    void swap(int *p,int *q){
    	cout<<"*p="<<*p<<" *q="<<*q<<endl; 
        int temp;
        temp=*p;
        *p=*q;
        *q=temp;
        cout<<"*p="<<*p<<" *q="<<*q<<endl; 
    }
    int main(){
    	int x=5,y=10;
    	swap(&x,&y);
    	cout<<x<<" "<<y<<endl;	
    	return 0;
    }

    结果:


    实参是两个地址&x,&y 形参两个指针变量是*p,*q,传入函数的是x,y的地址。相当于进行操作 int *p=&x; int *q=&y;即定义了两个指针分别指向两个变量。交换前*p所指向的是x的值5,*q所指向y的值10。
    交换的时候,定义了一个整型变量temp,用来交换*p,*q,也就是5和6。交换的是指针所指向的内容
    交换完成后,指针*p还是指向x,但是x的值已经和y交换了。

    不能试图通过改变形参指针变量的值而使实参指针变量的值改变。

    调用函数时不会改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值。

    地址传递这种方式有点儿绕,因为他想修改的是实参的值,而形参的改变无法改变实参,才被迫向函数传入了实参的地址,用来修改实参,所以这个方式的本质还是传值,只不过这个值是个地址罢了。并且实际操作的过程中,写法也很凌乱,比如你要操作实参x,就需要一直用*p来代替,而这个*怎么看怎么奇怪。所以接下来的引用传递,就是为了解决这个问题,引用传递才是真正意义上传入了实参。

     

    三、【引用传递】---真正的传址方式

    先来了解什么是引用:

    引用是对一个数据起一个别名,这是C++对C的一个扩充功能。引用本质上是一个指针常量。

    int a=5;                //定义一个变量a

    int &b=a;             //声明b是a的引用

    这里的&,不再是取地址符,而是引用声明符。

    在数据类型后面出现的&都是引用声明符,在其他场合出现的是取地址符。

    #include <iostream>
    using namespace std;
    void swap(int &a,int &b){  //&a是a的引用声明,不是取地址 
    	int temp=a;
    	a=b;
    	b=temp;
    }
    int main(){
    	int x=5,y=10;
    	swap(x,y);
    	cout<<x<<" "<<y<<endl;
    	return 0;
    }

    a,b是x,y的引用,也就是说a,b和x,y是等效的,交换了a,b,也就交换了x,y。

    至于深刻的理解,可以不必探究,因为引用就是为了简化指针的难度。

    想深刻了解引用,可以查看我的这一篇:

    有了引用,再也不用担心令人烦恼的C++指针了https://blog.csdn.net/qq_21989927/article/details/107447970

    展开全文
  •  一般来说C++参数传递三种方式:值传递、指针传递、引用传递。 一、值传递  值传递是最常见一种参数传递方式,但是对初学者来说也最容易出错。 #include<iostream> using namespace std; void f....

    摘要: 本篇博客仅作为笔记,如有侵权,请联系,立即删除(网上找博客学习,然后手记笔记,因纸质笔记不便保存,所以保存到网络笔记)。

      一般来说C++参数传递有三种方式:值传递、指针传递、引用传递。

    一、值传递

      值传递是最常见的一种参数传递方式,但是对初学者来说也最容易出错。

    #include<iostream>
    using namespace std;
    void fun(){
        int tmp;
        tmp = a;
        a = b;
        b = tmp;          
    }
    void main(){
        int m,n;
        m = 1;
        n = 1;
        fun(m,n);
        cout << m << " " << n << endl; //输出1、2
    }

      值传递只传m和n的副本,交换函数并没有体现出来。

    二、指针传递

      使用指针传递需要先了解一下指针的相关概念。

    #include<iostream>
    using namespace std;
    void fun(int *x){
        *x += 10;
    }
    void main(){
        int n = 10;
        fun(&n);
        cout << n << endl;    //输出结果为10    
    }

      fun()函数体内的x是指向外部变量n的指针,改变指针的内容将导致n的值改变,所以n的值成了10.

    三、引用传递

      引用相当于别名(绰号)。

    #include<iostream>
    using namespace std;
    void main(){
        int x;
        int &y = x;
        y = 99;
        cout << x << endl;   //输出结果为99  
    }

      程序中&y = x应当理解为y具有x的地址,即x与y具有相同的地址,地址相同了当然内容也相同,所以y = x = 99。

    比较:对比参数的三种传递方式,可以发现“引用传递”和“指针传递”的性质一样。引用传递可以做的任何事指针也能够做到,因为指针能够毫无约束地操作内存中的东西,这种强大的功能背后也必将隐藏着巨大的危险,所以要谨慎运用。

    转载于:https://www.cnblogs.com/daisy-996/p/10243317.html

    展开全文
  • 目录 “->”和“.”区别 C++传参三种方式(*和&区别;;一值传递二. 指针传递(地址传递)三. 传递引用) (int 参数)C
  • 实参,actual parameters,全称为"实际参数"是在调用时传递给函数的参数,即传递给被调用函数值。实参可以是常量、变量、表达式、函数等,无论实参是何类型量,在进行函数调用时,它们都必须具有确定值,...
  • 传值一共分为三种:传值,传地址,引用做形参。 1.传值#include using namespace std; void myswap(int x,int y) { int t; t=x; x=y; y=t; } int main() { int a,b; cout请输入需要交换两个数:
  • c++ new 结构体 返回是指针 什么是空指针 什么是NULL NULL和0: c++ new 结构体 返回是指针 什么是空指针 指针通过空指针常量赋值之后就是一个空指针,不指向任何实际对象或者函数。 什么是...
  • C++函数参数传递三种方式 值传递 特点: 函数调用时将实参值复制给形参,形参做任何改变不影响实参值 void swap(int a, int b) { int tmp = a; a = b; b = tmp; } int main() { int x = 20; int y = 10;...
  • 传递 void mySwap01(int a, int b) { int temp = a; a = b; b = temp; } //2. 地址传递 void mySwap02(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } //3. 引用传递 void mySwap03(int& a...
  • C++函数参数传递的三种形式: 1.值传递 2.指针传递(地址传递) 3.引用传递 1.值传递 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的...
  • C++ - 18】C++函数参数传递三种方式

    万次阅读 多人点赞 2014-05-28 10:04:52
    当进行函数调用时候,要填入与函数形式参数个数相同实际参数,在程序运行过程中,实参会将参数值传递给形参,C++函数参数传递有以下三种方式。 一. 值传递 1. 利用值传递方式,实际上是把实参内容复制到...
  • //值传递 int func(int a ,int b) { int t; t = a; a = b; b = t; return 0; } //地址传递 int func1(int* a, int* b) { int t; t = *a; *a = *b; *b = t; return 0; } //引用传递 int func2(int &...
  • 单向传递,只能通过指针变量来改变输入参数的值。 1、变量名为形参实参 void swap(int x,int y) 2、形参为指针变量 void swap(int *x,int *y) 传递形参地址 C++ 独有 不会分配存储空间,x是输入变量a别名...
  • C++参数传递三种

    2018-06-25 15:27:51
    C++里面三种参数传递方式一、值传递这种传递方式中,实参和形参是两个不同的地址空间,参数传递的实质是将原函数中变量的值,复制到被调用函数形参所在的存储空间中,这个形参的地址空间在函数执行完毕后,会被回收...
  • 通过本项目,确认是否已经掌握了这三种方式的原理,为后续学习做好准备。 两个变量交换,请用三种方法来实现,分别完成主程序编写: void myswap(int x, int y) { int t; t=x; x=y; y=t; } void myswap...
  • 项目1--C/C++语言中函数参数传递的三种方式 2015-09-11 09:08 11人阅读 评论(1) 收藏 举报 //(1)传值: #include  void myswap(int,int);  int main() {  int a,b;  printf("请输入待...
  • *文件名称:项目1函数参数传递的三种方式.cpp *作 者:陈光辉 *完成日期:2016年9月8日 *版 本 号:v1.0 * *问题描述:C语言提供了两种函数参数传递的方式:传值和传地址。 在C++中,又拓展了引用方式。通过
  • 问题:c/c++语言中函数参数传递的三种方式 *Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目1函数参数传递的三种方式.cpp *作 者:陈鹏鹏*完成日期:2016年9月8日 *版 ...
  • C++ 参数的三种传递

    万次阅读 多人点赞 2019-05-08 19:45:43
    C++ 参数的三种传递 开发工具与关键技术:C++、VisualStudio 作者:何任贤 撰写时间:2019年04月10日 这三种传递分别是值传递、指针传递和引用传递。值传递是我们常见的传递方式,不管是在C#还是JAVA,都是有值传递...
  • 问题及代码: /* * Copyright (c++) 2017,烟台大学计控...* 问题描述:C++语言中函数参数传递的三种方式 * 输入描述:输入两个整数 *输出描述:交换后两数的输出 */ //(1)传值 #include using namespace std; vo

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 791
精华内容 316
关键字:

c++参数传递的三种方式

c++ 订阅