参数传递:
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++中多维数组指针作为函数参数传递程序 在 C++ 中,多维数组指针作为函数参数传递是非常常见的编程技术。本文将详细介绍如何在 C/C++ 中将多维数组指针作为函数参数传递,並对相关知识点进行详细解释。 多维...
C++ 与C#之间的指针参数传递,实现无限量数据的传递,轻松无压力,方便在C++里面获取或者从C#传递数据到C++的动态库调用内。
C++中的指针参数传递是一种常见的编程技术,但是许多开发者对其机理不甚了解,本文将深入剖析C++指针参数传递的内存机理,解决开发者们长期以来对函数指针参数传递的误解。 函数指针参数传递的机理 ---------------...
这里,`ra`是一个函数指针参数,可以接受任何与之匹配类型的函数。在`test2`函数内部,可以通过`ra`调用传入的函数,实现了函数之间的动态调用和控制流的传递。 #### 6. 指向函数的指针数组 更进一步,可以创建一...
这篇文章将详细介绍 C# 调用 C++ 编写的 DLL 函数各种参数传递问题,包括不返回值的参数、带返回值的参数、传递结构体指针和传递结构体数组等。 1. 不返回值的参数 在 C++ 中,函数原型为 bool SendNewSms(char *...
本文档“C++之指针作为函数参数传递的问题.pdf”深入探讨了指针在函数参数传递过程中的一些常见误区和正确实践。作者清林(博客名:飞空静渡)在其博客(http://blog.csdn.net/fjb2080)中分享了这些宝贵的知识点。 #...
C和C++中的函数参数传递方式主要分为值传递、指针传递和引用传递。这些方式决定了参数在函数调用时的传值行为,以及它们在函数执行后是否能够影响原始数据。下面详细解释这些传递方式的知识点。 1. 值传递(Call by...
### 关于C++的函数参数传递方式 在C++编程中,函数参数的传递是非常重要的一个概念。通过函数参数的传递,我们可以实现不同函数间的数据交互。本文将深入解析C++中的函数参数传递机制,包括传值调用、传地址调用...
理解和掌握C/C++语言中函数参数传递的方式及其调用约定对于编写高效可靠的程序至关重要。通过合理选择参数传递方式(值传递或地址传递)和合适的函数调用约定,可以显著提高程序的性能和可维护性。
此外,C++还支持默认参数和函数重载等高级特性,这些特性能够扩展函数的参数传递机制,实现更加灵活和强大的功能。默认参数允许在函数声明时设定参数的默认值,而函数重载则允许存在多个同名函数,只要它们的参数...
除了直接使用函数指针调用函数,我们还可以将函数指针作为参数传递给其他函数,或者让函数返回一个函数指针。在上面的示例中,`RtnFunc`函数返回了一个指向`hello`函数的指针,而`call`函数接受一个返回字符指针的...
C++动态库中,回调函数是一种特殊的函数,它的指针可以作为参数传递给其他函数,在适当的时候被调用。在C#中,我们将使用委托来表示这个回调函数。C++的回调函数需要考虑函数指针的调用约定,通常使用`__stdcall`...
- 在编写函数时,可以考虑使用`const`关键字来限制指针参数的修改权限,如`void processStructPtr(const MyStruct* s)`,这可以防止无意的修改并帮助编译器进行优化。 - C++11引入了右值引用,可以用来优化大对象...
在C++编程语言中,函数的指针是一个非常强大的特性,它允许我们将函数作为一个值来处理,例如存储、传递和调用。这个概念是面向过程编程中的一个关键元素,尤其在设计模式如策略模式或者回调函数中发挥着重要作用。...
根据给定的文件信息,我们将深入探讨C++中的三种主要参数传递方式:值传递、指针传递和引用传递,并分析它们的特点、效率以及适用场景。 ### 值传递 值传递是最直接的参数传递方式,当调用函数时,会将实参的值...