`

C++函数参数传递和指针

    博客分类:
  • C++
 
阅读更多

参数传递:

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++之指针作为函数参数传递的问题.pdf

    c++之指针作为函数参数传递的问题的pdf版本 博客:http://blog.csdn.net/fjb2080 欢迎访问!

    C++指针参数传递内存详解

    用图示深度剖析c++指针参数传递内存时的详细过程,打破你以往对函数指针参数传递的误解(编译器总是要为函数的每个参数制作临时副本)。

    C++中回调函数(CallBack)的用法分析

    其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有...

    深入剖析C++函数的参数传递机制

    C语言的函数入口参数,可以使用值传递和指针传递方式,C++又多了引用(reference)传递方式。引用传递方式在使用上类似于值传递,而其传递的性质又象是指针传递,这是C++初学者经常感到困惑的。为深入介绍这三种参数...

    单链表操作中指针作为函数参数的典型错误.cpp

    单链表操作中指针作为函数参数的典型错误.cpp

    C++函数指针和回调函数使用解析

    函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针变量 实例 以下实例声明了函数指针变量 p,指向函数 ...

    C++参数传递与作用域

    函数进行参数传递,是在栈空间里为形参分配空间,并将计算各个实参的表达式的值,...根据函数的参数传递的不同,函数调用可以分为函数的值传递调用(传值调用)、函数的指针传递调用(传址调用)和函数的引用传递调用。

    值传递,指针传递,引用传递的区别,内含可运行代码和详细解释

    另一方面,值传递由于形参和实参内存地址不一样,有些功能并不能实现(swap()),因此,除了极为简单的函数会使用值传递外,大多数会采用引用传递。而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给...

    C++对象和指针的引用

    在C++中,可以说明指向类的数据成员和成员函数的指针。 指向数据成员的指针格式如下: &lt;类型说明符&gt;&lt;类名&gt;::*&lt;指针名&gt; 指向成员函数的指针格式如下: &lt;类型说明符&gt;(&lt;类名&gt;::*&lt;指针名&gt;)(&lt;参数表&gt;) 例如,...

    C++中引用传递与指针传递的区别(面试常见)

    最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真没有考虑过。 ...

    c++传递函数指针和bind的示例

    主要介绍了c++传递函数指针和bind的示例,需要的朋友可以参考下

    C#调用C++编写的DLL函数各种参数传递

    C#调用C++编写的DLL函数各种参数传递

    C/C++的参数传递机制

    近来公司招人较多,由此面试了非常...  C/C++函数参数的传递方式有三种:值传递(pass by value)、指针传递(pass bypointer)、引用传递(pass by reference)。  C/C++函数参数的传递通道是通过堆栈传递,默认遵

    C++函数指针详解

    学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那是函数指针了。本博文详细介绍一下常见的各种坑爹的函数指针。  至于指针的详细学习,推荐这篇博文C++指针详解  与数据一样,函数也...

    golang调用c++DLL传递char*型参数读取返回char*字符串内容

    golang调用c++DLL返回值为char*参数为const char*,读取返回DLL返回值,传递char*型参数

    C++ 课程作业 数组指针与字符串1——冒泡排序(函数指针,回调函数)

    如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。**回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,...

    C++中用指向数组的指针作函数参数

    1.一维数组名作为函数参数传递一位数组名,就相当于该数组的首个元素的地址; 代码如下:int a[10];int *p;p=a;//p=a与p=&a[0]是等价的实例代码: 代码如下:#include&lt;iostream&gt;using namespace std;int main(){ int ...

    C++指针作为函数的参数进行传递时需要注意的一些问题

    然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现。程序1.1 代码如下:#include&lt;iostream&gt;#include&lt;string&gt;using namespace std;int main(){ string str1=”I love China!”,str2=”I ...

Global site tag (gtag.js) - Google Analytics