参数传递:
1.值传递:
在这种情况下传给形参的是变量的值,而不是变量的地址,值是通过拷贝的方式传递给函数的形参的,这样值就到了一个新的内存里面。对其作出的任何改变都不会对原有值产生任何影响。
int main(){ void swap(int,int);//参数为整型变量 int i=3,j=4; cout<<"i="<<i<<",j="<<j<<endl; swap(i,j);//变量名 cout<<"i="<<i<<",j="<<j<<endl; system("PAUSE"); return 0; } void swap(int a,int b){//形参为整型变量 int temp; temp=a; a=b; b=temp; }
结果:
i=3,j=4
i=3,j=4
可以发现,执行函数swap后,形参a和b的改变不会影响实参i和j的值。
2.指针传递:
调用函数时,实参传递给形参的是实参的指针,所以形参保存的不是实参的值,而是指向值的地址。这个时候,形参不能改变自己的值,如果改变,它将找不到实参的值。它只能通过指针的方式,改变实参的值。这种方式下,内存里面还是有两个内存区,分别放实参和形参。
int main(){ void swap(int*,int*);//参数为整型指针变量 int i=3,j=4; cout<<"i="<<i<<",j="<<j<<endl; swap(&i,&j);//变量地址 cout<<"i="<<i<<",j="<<j<<endl; system("PAUSE"); return 0; } void swap(int *p1,int *p2){//形参为整型指针变量 int temp; temp=*p1; *p1=*p2; *p2=temp; }
结果:
i=3,j=4
i=4,j=3
调用函数时把变量i和j的地址传送给形参p1和p2,因此*p1和i为同一内存单元,*p2和j是同一内存单元。
这种方式还是“值传递”,只不过实参的值是变量的地址而已。而在函数中改变的不是实参的值(即地址,这种改变也影响不到实参),而是实参地址所指向的变量的值。
3.引用传递:
在一开始理解引用传递的时候,我假想为(&形参 = 实参),就像指针传递(*形参 = 实参)一样,如此一来,我怎么都想不通引用传递的实质。其实真实情况是这样的(&形参 = &实参)。C++最大的缺陷就是设计的规则不统一,导致无法用类比的方式进行推理。所以,一直都没觉得它是一门好的语言。
int main(){ void swap(int&,int&);//参数为整型变量的引用 int i=3,j=4; cout<<"i="<<i<<",j="<<j<<endl; swap(i,j);//变量名 cout<<"i="<<i<<",j="<<j<<endl; system("PAUSE"); return 0; } void swap(int &a,int &b){//形参为引用类型 int temp; temp=a; a=b; b=temp; }
结果:
i=3,j=4
i=4,j=3
当main函数调用swap函数时,由实参把变量名传给形参。i的名字传给引用变量a,j的名字传给引用变量b。此时a和b就分别与i,j占用同一内存空间。这种把实参地址传递到形参,使形参的地址取实参的地址,从而使形参与实参共享同一单元的方式,就是地址传递方式。
函数指针:
1.函数指针的基本使用:
2.函数指针作为参数传递:
(1)类多参成员函数作为参数传递:目前这个问题未解决。函数的地址不应该通过对象进行获取,而是应该通过类名来获取,因为它不是零时变量。
bool PerchWood::getCamera(CameraManager** camera) { if (!m_cameraManager) { return false; } *camera = m_cameraManager; return true; }
利用双指针实现指针的引用传递,是一个比较好的解决方式,这或许算是一个通用的写法吧
相关推荐
在C++中,通过多维数据的指针作为函数参数传递源程序
c++之指针作为函数参数传递的问题的pdf版本 博客:http://blog.csdn.net/fjb2080 欢迎访问!
用图示深度剖析c++指针参数传递内存时的详细过程,打破你以往对函数指针参数传递的误解(编译器总是要为函数的每个参数制作临时副本)。
其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有...
C语言的函数入口参数,可以使用值传递和指针传递方式,C++又多了引用(reference)传递方式。引用传递方式在使用上类似于值传递,而其传递的性质又象是指针传递,这是C++初学者经常感到困惑的。为深入介绍这三种参数...
单链表操作中指针作为函数参数的典型错误.cpp
函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针变量 实例 以下实例声明了函数指针变量 p,指向函数 ...
函数进行参数传递,是在栈空间里为形参分配空间,并将计算各个实参的表达式的值,...根据函数的参数传递的不同,函数调用可以分为函数的值传递调用(传值调用)、函数的指针传递调用(传址调用)和函数的引用传递调用。
另一方面,值传递由于形参和实参内存地址不一样,有些功能并不能实现(swap()),因此,除了极为简单的函数会使用值传递外,大多数会采用引用传递。而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给...
在C++中,可以说明指向类的数据成员和成员函数的指针。 指向数据成员的指针格式如下: <类型说明符><类名>::*<指针名> 指向成员函数的指针格式如下: <类型说明符>(<类名>::*<指针名>)(<参数表>) 例如,...
最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真没有考虑过。 ...
主要介绍了c++传递函数指针和bind的示例,需要的朋友可以参考下
C#调用C++编写的DLL函数各种参数传递
近来公司招人较多,由此面试了非常... C/C++函数参数的传递方式有三种:值传递(pass by value)、指针传递(pass bypointer)、引用传递(pass by reference)。 C/C++函数参数的传递通道是通过堆栈传递,默认遵
学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那是函数指针了。本博文详细介绍一下常见的各种坑爹的函数指针。 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函数也...
golang调用c++DLL返回值为char*参数为const char*,读取返回DLL返回值,传递char*型参数
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。**回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,...
1.一维数组名作为函数参数传递一位数组名,就相当于该数组的首个元素的地址; 代码如下:int a[10];int *p;p=a;//p=a与p=&a[0]是等价的实例代码: 代码如下:#include<iostream>using namespace std;int main(){ int ...
然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现。程序1.1 代码如下:#include<iostream>#include<string>using namespace std;int main(){ string str1=”I love China!”,str2=”I ...