有关*和&的用法 本质上讲,pro(int * num)和pro(int & num)传递的参数都是指针,效率应该一样。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要把num指向的值改为10pro(int* num){*num=10;}pro(int& num){num=10;} 我做的试验也是这样,在实际调用函数时,int num第一个函数pro(&num);第二个函数pro(num);但本质上是什么意思呢? pro(int * i)时穿指针调用pro(int &i)时时穿引用调用,在函数体内,第一个函数中的参数i是一个指针如果要得到i的值的话,的用*i,而第二个i穿进去的就是一个整数变量i要得到它的值的话,直接用i就行了再编译器实现时其实都是一个指针,可以说本质相同效率也没什么区别Pro(int *i)时以前C语言的风格,在那时,没有穿引用这个概念,在C++中增加了这中调用方式,其目的一是为了方便:如果都要穿指针的话,每次调用还得取一次改变量的地址,然后要取得它的值,又得做一次取值炒作如:在实现这个函数的时候pro(int *i){ int j=*i; }而在调用时,又的int i;pro(&i)如果是穿引用调用pro(int &i){ int j=i;}调用它int i;pro(i);二是为了安全性,大家知道,指针这种东东是非常容易出错的说不定在函数调用的过程中,把该指针直到其他的地方去了,调试起来就很麻烦,而且可能破坏有用数据 引用参数和指针参数的作用其实是一样的关于参数传递方法的分析在VC中,有三种传递参数的方法:传值(value)、传址(address)、引用(refrence)。现对各种方法的实质进行分析。深入 首先看下面代码:#include <afxwin.h>void foo1(CPoint pt) //传值{}void foo2(CPoint& pt) //引用{}void foo3(CPoint* ppt) //传址{}void main(){ CPoint pt(1,2); foo1(pt); foo2(pt); foo3(&pt);}1. 当调用foo1(pt)时,实际执行如下操作:mov eax, pt.ypush eax //把pt.y压栈mov ecx, pt.xpush ecx //把pt.x压栈……如果pt含有其他成员,还要一个一个压栈call foo1add esp, 8 2. 当调用foo2(pt)时,实际执行如下操作:lea eax, pt //把pt的地址放到eax寄存器中push eax //把pt的地址压栈call foo2add esp, 4 3. 当调用foo3(&pt)时,执行的操作和foo2(pt)完全一样,这说明传址和引用在实现上是完全一样的。由上面分析可以看出,引用/传址的代码明显要少于传值,就是说执行效率高。浅出 如果对上面的代码不完全了解的话,记住下面的解释:1. 传值系统先产生一个临时变量,然后把参数值复制给该临时变量,在函数内部是对临时变量执行操作,所以你也别指望能对原参数执行什么有用的修改了。2. 引用/传址系统不产生临时变量,而是把实参地址传递到函数中,你对该参数的改变都会如实反应到原参数。如果你能确保在该函数中不应该修改该参数,那么在函数声明中把参数定义为const即可,如:void foo4(const CPoint& pt)。结论 尽可能用传址和引用的调用方式,不到万不得已,不要用传值的方式。例外 如果你的参数是简单类型(如:int,long,DWORD等,而不是类、结构对象),那么用什么方法取决于你是否需要在函数中修改参数值。 至于这么复杂吗?二者都是对地址的调用,一个是显式的,一个是隐式的。sub1(int*);sub2(int&);func(){int* a;int b;sub1(a);sub2(b);return;}明白没? 楼上的兄弟,好像是因为你理解错了才会认为如此简单吧所谓的地址调用,其本质是传值调用,只不过它的值一个地址是和传引用调用本质不同的,不信,可以用如下代码做实验Test(int * p){ p=NULL;}main(){ int * p=new int; * p=4; test(p); ASSERT(p!=NULL); delete p;}现在明白没,我不知道所谓的显示,隐士是怎么来的,好像从来没说过这样的说法,只听说传值,传引用,可能我太孤陋寡闻了吧 win32 API 改变指定文件的路径 求助关于抓包的软件 音视频的编解码和网络传输的问题,跪求前辈帮忙! 关于自己用socket和internet远程http服务器建立连接的问题 我该走哪条路呢?????? VC++新手有关MID窗口的问题(欢迎高手指导) !!!如何将bmp转换为jpg图象!!!!给一份源码 !! 关于伪造UDP包IP地址。 vc2010今天碰到怪事?界面按钮无响应 如何在vc中通过一个URL启动IE S.0.S 紧急呼救,大虾出手! 请问怎么恢复硬盘下快速格式化后的数据!!! 问题解决,分数全送。 请问在文档结构中:如何在文档类中,取的框架类
{
*num=10;
}pro(int& num)
{
num=10;
}
第一个函数pro(&num);
第二个函数pro(num);
但本质上是什么意思呢?
pro(int &i)时时穿引用调用,
在函数体内,第一个函数中的参数i是一个指针
如果要得到i的值的话,的用*i,
而第二个i穿进去的就是一个整数变量i
要得到它的值的话,直接用i就行了
再编译器实现时其实都是一个指针,可以说本质相同
效率也没什么区别Pro(int *i)时以前C语言的风格,在那时,没有
穿引用这个概念,在C++中增加了这中调用方式,
其目的一是为了方便:如果都要穿指针的话,每次调用还得
取一次改变量的地址,然后要取得它的值,又得做一次取值炒作
如:在实现这个函数的时候
pro(int *i)
{
int j=*i;
}
而在调用时,又的
int i;
pro(&i)如果是穿引用调用
pro(int &i)
{
int j=i;
}
调用它
int i;
pro(i);
二是为了安全性,大家知道,指针这种东东是非常容易出错的
说不定在函数调用的过程中,把该指针直到其他的地方去了,
调试起来就很麻烦,而且可能破坏有用数据
关于参数传递方法的分析
在VC中,有三种传递参数的方法:传值(value)、传址(address)、引用(refrence)。现对各种方法的实质进行分析。深入
首先看下面代码:#include <afxwin.h>
void foo1(CPoint pt) //传值
{
}
void foo2(CPoint& pt) //引用
{
}
void foo3(CPoint* ppt) //传址
{
}void main()
{
CPoint pt(1,2);
foo1(pt);
foo2(pt);
foo3(&pt);
}
1. 当调用foo1(pt)时,实际执行如下操作:mov eax, pt.y
push eax //把pt.y压栈
mov ecx, pt.x
push ecx //把pt.x压栈……如果pt含有其他成员,还要一个一个压栈
call foo1
add esp, 8
2. 当调用foo2(pt)时,实际执行如下操作:lea eax, pt //把pt的地址放到eax寄存器中
push eax //把pt的地址压栈
call foo2
add esp, 4
3. 当调用foo3(&pt)时,执行的操作和foo2(pt)完全一样,这说明传址和引用在实现上是完全一样的。由上面分析可以看出,引用/传址的代码明显要少于传值,就是说执行效率高。浅出
如果对上面的代码不完全了解的话,记住下面的解释:1. 传值系统先产生一个临时变量,然后把参数值复制给该临时变量,在函数内部是对临时变量执行操作,所以你也别指望能对原参数执行什么有用的修改了。2. 引用/传址系统不产生临时变量,而是把实参地址传递到函数中,你对该参数的改变都会如实反应到原参数。如果你能确保在该函数中不应该修改该参数,那么在函数声明中把参数定义为const即可,如:void foo4(const CPoint& pt)。结论
尽可能用传址和引用的调用方式,不到万不得已,不要用传值的方式。例外
如果你的参数是简单类型(如:int,long,DWORD等,而不是类、结构对象),那么用什么方法取决于你是否需要在函数中修改参数值。
二者都是对地址的调用,一个是显式的,一个是隐式的。
sub1(int*);
sub2(int&);
func()
{
int* a;
int b;
sub1(a);
sub2(b);
return;
}
明白没?
所谓的地址调用,其本质是传值调用,只不过它的值一个地址
是和传引用调用本质不同的,
不信,可以用如下代码做实验
Test(int * p)
{
p=NULL;
}main()
{
int * p=new int;
* p=4;
test(p);
ASSERT(p!=NULL);
delete p;
}
现在明白没,我不知道所谓的显示,隐士是怎么来的,好像从来没说过这样的说法,只听说传值,传引用,可能我太孤陋寡闻了吧