精华内容
下载资源
问答
  • c++地址传递
    千次阅读
    2021-11-02 10:14:23

    先公布上期每日一练的答案(汉诺塔问题):

    #include<iostream>
    using namespace std;
    void move(char src, char dest)
    {
    	cout << src << "-->" << dest<<endl;
    }
    
    void hanoi(int n, char src, char medium, char dest)
    {
    	if (n == 1)
    		move(src, dest);
    	else
    	{
    		hanoi(n - 1, src, dest, medium);
    		move(src, dest);
    		hanoi(n - 1, medium, src, dest);
    	}
    }
    int main()
    {
    	int m;
    	cout << "Enter the number of diskes:";
    	cin >> m;
    	cout << "the step to moving " << m << "diskes:" << endl;
    	hanoi(m, 'A', 'B', 'C');
    	return 0;
    }

    我们这期主要来探讨一下函数的三种不同的传参方式,分别是值传递,地址传递和引用传递,那么这三种传递方式有什么区别呢,请先看这个例子:

    #include <iostream>
    using namespace std;
    void exchange(int a, int b)
    {
    	int temp;
    	temp = a;
    	a = b;
    	b = temp;
    }
    
    int main()
    {
    	int x, y;
    	cin >> x >> y;
    	exchange(x, y);
    	cout << x << " " << y;
    }

    不难看出,这是一个用于交换两个数字的函数,但是请读者想一下,这个函数能实现这个功能吗?

    事实上,这个是不能的,为什么?

    因为这里的传参方式为值传递,什么叫值传递呢?我们从字面上理解,就是我们只是把实参x和y的数值赋值给形参a和b,那么在函数体内只是将形参a和b的值进行交换,并不会影响我们的实参x和y,所以我们有一个结论,值传递不会修饰实参。

    哪有没有什么办法能让形参修饰实参呢?答案就是我们的地址传递和引用传递这两种传参方式了。

    来看下列代码:

    #include <iostream>
    using namespace std;
    void exchange(int *a, int *b)
    {
    	int temp;
    	temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    int main()
    {
    	int x, y;
    	cin >> x >> y;
    	exchange(&x, &y);
    	cout << x << y;
    }

    这里所用的就是地址传递了,所谓地址传递,也很好理解,传递的是地址,那么主函数调用的时候就要传进x和y的地址,这里就要用到取地址符(&),将x和y的地址传进去,函数里面由于a和b都是指针类型,所以在交换的时候要用到(*)来进行解引用的操作,解引用就是获取a和b对应地址下对应的值,例如a储存的是x的地址,那么*a就可以获得x的值,这样,我们就可以实现两数交换的操作了,所以地址传递是可以修饰实参的。

    在C++中,还提供了另一种更为简便的方法,那就是引用传递的方式,事实上,引用的本质其实就是指针常量,所以也可以达到修饰实参的效果,代码如下:

    #include <iostream>
    using namespace std;
    void exchange(int &a, int &b)
    {
    	int temp;
    	temp = a;
    	a = b;
    	b = temp;
    }
    
    int main()
    {
    	int x, y;
    	cin >> x >> y;
    	exchange(x, y);
    	cout << x << " " << y;
    }

    其实引用的作用就是给变量起一个别名,所以在这段代码中,a就相当于x的别名,那么在函数体内对a进行操作本质上就是对x进行操作,所以引用传递也是可以起到修饰形参的作用。

    以上就是本期的全部内容了,有喜欢的读者可以点个关注哦!

    更多相关内容
  • C++中值传递地址传递与引用传递

    千次阅读 2020-04-08 17:05:01
    1.值传递 所谓值传递,就是函数调用时实参将数值传入给形参 值传递时,如果形参发生改变,并不会影响实参 void swap(int a, int b) { int temp = a; a = b; b = temp; cout << "swap函数中a = " <&...

    1.值传递

    • 所谓值传递,就是函数调用时实参将数值传入给形参
    • 值传递时,如果形参发生改变,并不会影响实参
    void swap(int a, int b)
    {
    	int temp = a;
    	a = b;
    	b = temp;
    
    	cout << "swap函数中a = " << a << "\ta的指针为:" << &a << endl;
    	cout << "swap函数中b = " << b << "\tb的指针为:" << &b << endl;
    }
    
    void main()
    {
    	int a = 10;
    	int b = 20;
    	cout << "交换前:" << endl;
    	cout << "a:" << a << "\ta的指针为:" << &a << endl;
    	cout << "b:" << b << "\tb的指针为:" << &b << endl;
    	cout << endl;
    	swap( a , b);
    	cout << endl;
    	cout << "交换后:" << endl;
    	cout << "a:" << a << "\ta的指针为:" << &a << endl;
    	cout << "b:" << b << "\tb的指针为:" << &b << endl;
    
    }
    
    

    在这里插入图片描述
    由运行结果可知:

    • 对于形参,地址指针发生了改变,值也发生了改变(相当于重新分配了内存)
    • 对于实参,都不会发生改变

    2.地址传递

    • 如果想修改实参,就用地址传递
    void swap( int *p1 , int *p2) 
    {
    	int temp = *p1;
    	// cout << "*p1代表的意义:" << temp << endl;
    	*p1 = *p2;
    	*p2 = temp;
    	cout << "swap函数中a:" << *p1 << "\ta的指针为:" << p1 << endl;
    	cout << "swap函数中b:" << *p2 << "\tb的指针为:" << p2 << endl;
    
    }
    
    void main()
    {
    	int a = 10;
    	int b = 20;
    	cout << "交换前:" << endl;
    	cout << "a:" << a << "\ta的指针为:" << &a << endl;
    	cout << "b:" << b << "\tb的指针为:" << &b << endl;
    	cout << endl;
    	swap( &a , &b);
    	cout << endl;
    	cout << "交换后:" << endl;
    	cout << "a:" << a << "\ta的指针为:" << &a << endl;
    	cout << "b:" << b << "\tb的指针为:" << &b << endl;
    }
    

    在这里插入图片描述
    由运行结果可知:

    • 对于形参,地址指针不变,值发生了改变
    • 对于实参,地址指针不变,值发生了改变

    3.引用传递

    • 函数传参时,也可以利用引用的技术让形参修饰实参
    • 引用相当于给同一块内存起别名,别名(b)原名(a) 都可以修改同一内存中的数据。
    • 赋值操作,则是重新开辟一个内存将原名(a) 数据赋值给新名(c),是两块内存
      看a/b/c的变化
    void swap( int &p1 , int &p2) 
    {
    	int temp = p1;
    	p1 = p2;
    	p2 = temp;
    	cout << "swap函数中a:" << p1 << "\ta的指针为:" << &p1 << endl;
    	cout << "swap函数中b:" << p2 << "\tb的指针为:" << &p2 << endl;
    
    }
    
    void main()
    {
    	int a = 10;
    	int b = 20;
    	cout << "交换前:" << endl;
    	cout << "a:" << a << "\ta的指针为:" << &a << endl;
    	cout << "b:" << b << "\tb的指针为:" << &b << endl;
    	cout << endl;
    	swap( a , b);
    	cout << endl;
    	cout << "交换后:" << endl;
    	cout << "a:" << a << "\ta的指针为:" << &a << endl;
    	cout << "b:" << b << "\tb的指针为:" << &b << endl;
    }
    

    在这里插入图片描述
    由运行结果可知:

    • 对于形参,地址指针不变,值发生了改变
    • 对于实参,地址指针不变,值发生了改变

    总结

    1. 如果不想修改实参,就用值传递,如果想修改实参,就用地址传递或者引用传递
    展开全文
  • 浅谈C++传递地址传递、引用传递

    千次阅读 多人点赞 2018-10-25 17:22:04
    浅谈C/C++传递地址传递、引用传递共同的困惑什么是函数形式参数和实体参数功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...


    作者:Gl_Zhang96
    来源:CSDN
    版权声明:本文为博主原创文章,转载请附上博文链接!

    共同的困惑

    相信大家在入门学习C++的时候都会有这样一个疑惑,在对函数调用的时候,函数内部的操作究竟会不会引起主函数变量值的改变。对于这个问题,简单谈论一下我自己的理解。理解不深,如有错误欢迎大家指正。

    函数

    我理解的函数实际是一个功能的集合。类似数学中的函数,给定一个输入 x x x ,就会得到一个输出 y y y。C++的程序也是一样,给定一些参数,通过调用函数,得到一些返回值或者实现某些功能。

    形式参数和实体参数

    首先介绍一下函数的形式参数(以下简称形参)和实体参数(以下简称实参)。
    话不多说,先来一段代码:

    #include <iostream>
    using namespace std;
    
    void change(int c, int d)
    {
        c = 3;
        d = 5;
    }
    
    int main()
    {
        int a = 1;
        int b = 1;
        change(a, b);
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        return 0;
    }
    

    在以上代码中,除主函数以外,定义了一个change函数,函数带有参数(int c, int d),这两个就称为形参,通过这两个参数在函数内部的运算来标明函数的实现内容。在主函数(main)中,我们调用了函数change(),传入的两个参数(int a, int b)就是实参了。那么函数的实参是如何传递值给形参的呢?

    值传递(数组作为参数时除外)

    我们来运行上方的代码,得到如下的结果:
    在这里插入图片描述
    很显然,change()函数并没有改变主函数中a和b的值。这种由实参到形参传递参数值的过程就称为值传递了。
    讲到这里可能还是有点晦涩难懂,通俗的来讲,值传递相当于将原来的参数复印了一份交给函数,无论函数对复印件如何处理,都不会对原件产生任何的影响。而当函数执行结束后,就会将形参释放,也就是将复印件销毁了。
    下面用一个简单的图来表示这个过程:
    在这里插入图片描述
    对于main函数而言,系统开辟一块内存空间,其中存放变量a和b,值都为1。然后调用函数change(),系统重新开辟一块存储空间,并将a和b的值拷贝一份给c和d(这里注意,形参可能与实参同名,例如这里的形参也可以是a和b,但二者不是一个东西,因为根本不在一块存储空间内),此时c和d的值变为1,进而通过函数的操作将c和d的值修改为3和5,函数调用结束,change区域变量释放。显然main中a和b的值并未发生任何改变。

    地址传递

    那如果想通过函数来修改变量的值该怎么做呢,一种方法就是通过地址传递,请看下面的代码:

    #include <iostream>
    using namespace std;
    void change(int *c, int *d)
    {
       *c = 3;
       *d = 5;
    }
    
    int main()
    {
       int a = 1;
       int b = 1;
       change(&a, &b);
       cout << "a=" << a << endl;
       cout << "b=" << b << endl;
       return 0;
    }
    

    此处change函数的形参变为了整型指针,并且调用change()函数时,传入的参数也是变量a和b的地址,即让指针c和d指向变量a和b。还是用一个图来说明这个问题:
    在这里插入图片描述
    同之前一样,当调用函数change()时,系统新开辟一块存储空间用来存放c和d。然而不同的是,此时是将a和b的地址传递给c和d(即c和d中存放的是a和b的地址)。此时相当于c和d指向a和b,可以通过这个指向的箭头来对a和b存放的值做任意改动(这里是赋值成3和5)。所以理所当然得到如下的结果:
    在这里插入图片描述
    所以,将变量的地址传递出去是一件非常危险的事情哦,因为这样函数就可以通过地址任意修改变量的值了。

    引用传递

    变量的引用相当于给变量起了一个别名,两者指的其实是一个东西。所以运行下面的代码:

    #include <iostream>
    using namespace std;
    
    void change(int &c, int &d)
    {
       c = 3;
       d = 5;
    }
    
    int main()
    {
       int a = 1;
       int b = 1;
       change(a, b);
       cout << "a=" << a << endl;
       cout << "b=" << b << endl;
       return 0;
    }
    

    得到结果:
    在这里插入图片描述
    既然指的是同一个东西,当然a和b的值也就通过函数改变了。引用传递和地址传递起到了同样的效果,但书写和理解起来都似乎更简单一些

    展开全文
  • 用最经典的交换函数来理解C++的三种参数传递方式——传值,传址,传引用 //整数交换 变量 指针 引用 #include <iostream> using namespace std; void vswap(int x,int y){//形参是变量 int t; t = x; x ...

    用最经典的交换函数来理解C++的三种参数传递方式——传值,传址,传引用

    //整数交换 变量 指针 引用 
    #include <iostream>
    using namespace std; 
    void vswap(int x,int y){//形参是变量 
    	int t;
    	t = x;
    	x = y;
    	y = t;
    	cout<<"形参xy是变量的交换结果:"<<"x="<<x<<"   y="<<y<<endl;
    }
    
    void pswap(int *x,int *y){//形参是指针 
    	int t = *x;
    	*x = *y;
    	*y = t;
    	cout<<"形参xy是指针的交换结果:"<<"x="<<x<<"   y="<<y<<endl; 
    	cout<<"形参xy是指针的交换结果:"<<"*x="<<*x<<"   *y="<<*y<<endl; 
    }
    
    void rswap(int &x,int &y){//形参是引用 
    	int t;
    	t = x;
    	x = y;
    	y = t;
    	cout<<"形参xy是引用的交换结果:"<<"x="<<x<<"   y="<<y<<endl;
    }
    
    int main(){
    	int a=3,b=5;
    	cout<<"交换前:"<<"a="<<a<<"   b="<<b<<endl;
    	//vswap(a,b);//变量传递 
    	//pswap(&a,&b);//指针传递 
    	//rswap(a,b);//引用传递 
    	cout<<"交换后:"<<"a="<<a<<"   b="<<b<<endl;
    	return 0;
    } 
    

    值传递:vswap(a,b)

    交换前:a=3 b=5
    形参xy是变量的交换结果:x=5 y=3
    交换后:a=3 b=5

    结果分析:交换没有成功,实参与形参结合后,形参成功交换,但在swap函数运行结束时,释放x,y与temp的空间,并没有实际改变实参,所以交换失败。

    值传递通常用于函数的输入。

    地址传递:pswap(&a,&b)

    交换前:a=3 b=5
    形参xy是指针的交换结果:x=0x6ffe0c y=0x6ffe08
    形参xy是指针的交换结果:*x=5 *y=3
    交换后:a=5 b=3

    结果分析:交换成功,实参是两个地址,形参是两个int类型指针,实参与形参结合后,形参是两个指向实参的指针,要对形参进行操作,就是对形参所指向的实参存储空间进行操作,交换了形参指向的空间,实参的值成功交换。main函数与swap函数共用了x,y的存储空间,在main中用x,y访问,在swap中用*x,*y访问,本质上是对同一块空间空间进行操作,在swap函数运行结束时,释放*x,*y与temp的空间

    PS:指针第一次出现是在函数形参表里面,即初始化中星号是一个界定符–表示指针,之后在函数体中星号表示间接访问*a即表示访问a指向的空间,也就是具体的变量。
    定义int *a = &x后,间接访问时,可以把*a当成x来用。

    值传递通常用于函数的输出,将被调用函数修改的值传递给调用者。

    引用传递:rswap(a,b)

    交换前:a=3 b=5
    形参xy是引用的交换结果:x=5 y=3
    交换后:a=5 b=3

    结果分析:交换成功,&x是a的别名&y是b的别名,此时&不是取地址,是引用的标识,&x与&y本身不是一种数据类型,本身不占存储单元,系统也不给引用分配存储单元。当对形参的值进行交换的时候,也是对实参存储空间进行操作,改变了形参的指向,使实参的值成功交换。与指针传递相比,引用传递节省了空间开销

    引用传递用于返回自身,可以作为左值,基本上可以替代了传址操作

    展开全文
  • 1 值传递 调用子函数时把主函数中实参的值传递给子函数的形参,在子函数中完成对应的操作。此时,子函数中的所有操作都是对形参来进行的,因此主函数中的实参不受子函数的影响。 且子函数的形参存放在栈区,函数...
  • C++传递地址传递的区别

    千次阅读 2021-08-20 16:42:04
    这里写目录标题1.概念解释1.1值传递:1.2指针传递:2.代码案例2.1值传递 1.概念解释 1.1值传递: 形参是实参的拷贝,在外部某个函数中改变形参的值并不会...形参为指向实参地址的指针,当对形参的指向操作时,就相当
  • 最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真没有考虑过。 ...
  • C++中主要有两种能实现地址传递的方法: 指针 引用 此处记录了使用 指针 来传递数组进函数的一些方法。(包括一维数组的两种值传递、两种地址传递,二维数组的一种值传递、一种地址传递) 尤其需要注意函数形参的...
  • c++传递闭包

    2019-03-19 13:15:36
    传递闭包C++描述,应用c++语言描述传递闭包算法
  • C++传递地址传递和引用传递

    千次阅读 多人点赞 2020-02-19 17:50:24
    C++传递地址传递 在我们在函数间数据传递的时候会出现,在函数中数据处理的间而过理想的,但在主函数中数据并没有发生变化。具体详情如下: 在数据传递时,分为值传递地址传递; 值传递:在函数调用时实参将...
  • golang调用c++DLL返回值为char*参数为const char*,读取返回DLL返回值,传递char*型参数
  • C++传递自定义类型作为参数到Qml 具体请访问https://www.jianshu.com/p/bc3ac5b4b528
  • C++传递三种方式

    2021-10-11 21:33:11
    C++传递三种方式1.值传递2.地址传递3.引用 1.值传递 // 值传递 void swap(int a, int b) { int temp = a; a = b; b = temp; } 2.地址传递 // 值传递 void swap(int *a, int *b) { int temp = *a; *a = *b; ...
  • C++ 二维数组参数传递的实现方法 int a[2][2]={ {4, 6}, {9, 11} }; 我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做?  第一种方式是直接传递...
  • C++函数的三种传递方式为:值传递、指针传递和引用传递传递:void fun(int x){ x += 5; //修改的只是y在栈中copy x,x只是y的一个副本,在内存中重新开辟的一块临时空间把y的值 送给了x;这样也增加了程序运行的...
  • c++ - >指针传递

    2022-03-02 23:53:00
    指针传递
  • C++ 与C#之间的指针参数传递,实现无限量数据的传递,轻松无压力,方便在C++里面获取或者从C#传递数据到C++的动态库调用内。
  •   声明一个Employee类,其中包括表示姓名、街道地址、城市和邮编等属性,包括ChangeName()和display()等函数。Display()使用cout语句显示姓名、地址、城市和邮编等属性,函数setName()改变对象的姓名属性,实现并...
  • C/C++按值传递和按地址传递

    万次阅读 多人点赞 2018-04-06 19:41:11
    C/C++的按值传递和按地址传递有明显不同,下面对他们作个区别:按值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。按地址传递:在调用函数的时候将原...
  • c++函数三种传递方式

    千次阅读 2022-01-21 16:37:26
    这里我会带大家了解c++中函数的三种传递方式 我们以swap(交换)函数为例: int tem = a; a = b; b = tem; 第一种,值传递: 用形参接收实参的值进行操作,对实参没有影响 eg: #include using namespace std; ...
  • C++传递和引用传递的区别

    千次阅读 2020-05-27 17:16:02
    c++中参数传递的区别: 1.值传递: 可以想象改变的只是实参的“替身”的值,而实参本身不会被改变。 值传递:将实参的值传递给形参;形参是实参的“替身”,但与实参本质上不是“同一个人”,只是值复制过来一样而已...
  • C/C++函数传递二维数组

    千次阅读 2020-11-20 10:38:31
    函数参数传递二维数组的问题 解决方案 1.传递第二维和更高维的大小 2.根据数组的存储原理把二位数组当作一维数组来操作(降维处理) 函数参数传递二维数组的问题 将二维数组当作参数的时候,必须指明所有维数...
  • C++中值传递和引用传递的区别

    万次阅读 多人点赞 2017-12-06 10:25:39
    C++传递和引用传递的区别 一例呼醒迷中人
  • C/C++指针传递和引用传递傻傻分不清楚
  • 传值 参数传进来之后只是一个局部变量,修改形参的值不会改变实参的值,也就是在函数里面改变该参数并不会改变主函数里面该变量的值。 #include<...传进来的是一个地址,通过这个地址可以找到该地址存放的
  • C++引用传递基础

    千次阅读 多人点赞 2018-11-26 16:39:31
    C++引用传递基础 引用变量:相当于是给变量内存块(内存单元)起别名 例如: 这里,我们存放整形变量10的内存单元名字为a,我们用过int &b = a; 让这个叫a的内存块有另外一个名字为b,从这里开始,a和b都...
  • c++多线程如何传递参数(值传递,引用传递) 转自 chen沉尘【C++多线程】 感谢作者,我只是个搬运工 线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序...
  • C/C++语言中值传递、指针传递和引用传递

    万次阅读 多人点赞 2018-01-06 00:09:00
    在C语言中值传递、指针传递和引用传递这三种函数参数传递方式是比较基本的知识,用的比较普遍,但不仔细分析其实质的话,时间长容易记混了。网上的资料也较多但多数都不系统,本文力求用最白话的表达和简单的示例把...
  • 传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->...形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 406,518
精华内容 162,607
关键字:

c++地址传递

c++ 订阅