C++中函数形参为“类型 *&变量名”什么意思?

例如一个函数定义:
void test( DATA_TYPE *&var )
{
...... // 假设 DATA_TYPE 为某种类型
}
我想问的是,若引用变量 *&var 相当于直接引用 var,可是再 C++ 中,若函数形参为 &var 表示“引用”,那么在“引用”前加指针运算符,表明的是此函数接收变量 var 的地址??还是接收别的??若给出答案,请给出出处或证明回答正确的例子,谢谢。

一、先看一段代码:

#include <iostream>

using namespace std;

void freePtr1(int* p1)

{

delete p1;

p1 = NULL;

}

void freePtr2(int*& p2)

{

delete p2;

p2 = NULL;

}

void main()

{

int *p1 = new int;

*p1 = 1;

freePtr1(p1);

int *p2 = new int;

*p2 = 2;

freePtr2(p2);

system("pause");

}

思考:在freePtr1和freePtr2 的比较中,你能发现它们的不同点吗?

二、对代码进行解释:

#include <iostream>

using namespace std;

void freePtr1(int* p1)

{

//未释放内存前 -> p1 Address : 0012FDDC p1 value : 003429B8,在这里,p1它也是一个变量,既然是一个变量,那么它将会以值的传递,把外部变量p1传到栈内,在栈内产生一个地址:0012FDDC,当然,它的值不会变仍然是指向堆地址:003429B8 。

delete p1; //系统回收p1值的地址003429B8处的内存。

p1 = NULL;//对p1赋以NULL值即:00000000,注意:p1本身的地址并没有变,变的是p1的值。

//释放内存后 -> p1 Address : 0012FDDC p1 value : 00000000,出栈后,p1由于是一个临时对象,出栈后它会自动被视为无效。

}

void freePtr2(int*& p2)

{

//未释放内存前 -> p2 Address : 0012FEC8 p2 value : 003429B8,p2是一个指针的引用,即引用指向指针,记住引用的特点:对引用的对象直接操作。所以它的地址和值与栈外的main()函数中,p2的值是同一个。

delete p2; //对p2所引用的指针进行释放内存,即:系统回收main()函数中 p2的值 003429B8 地址处的内存。

p2 = NULL;//对main()函数中p2的指针赋以NULL值。

//释放内存后 -> p2 Address : 0012FEC8 p2 value : 00000000,由于操作的对象都是main()函数中的p2,所以它将应用到原变量中。

}

void main()

{

int *p1 = new int;

//释放内存前-> p1 Address : 0012FED4 p1 value : 003429B8

freePtr1(p1);

//释放内存后-> p1 Address : 0012FED4 p1 value : 003429B8

int *p2 = new int;

//释放内存前-> p2 Address : 0012FEC8 p2 value : 003429B8

freePtr2(p2);

//释放内存后-> p2 Address : 0012FEC8 p2 value : 00000000

system("pause");

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-01-22
回答者: theodorez - 经理 四级

这孩子不错。
第2个回答  2009-01-22
楼上的那个代码太长了。

给你写一个代码,你自己研究。。

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
int i = 100;
int *p1 = &i;
int &j= *p1;
cout << "&j = " << &j << endl;

int *p2 = &j;
int *&p = *&p2; //这里我要说明一下,他指向p2所指向的指针的地址
cout << "*&p = " << *&p << endl;
return 0;
}

以上在VC++.NET 2003 调试通过。。。
第3个回答  2009-01-22
This is pass by reference.
That means declaring the parameters as references(if you are not familiar with reference ,in short,that gives a variable a second name,then both of its two name refer to the same content,but they use the same memory box).So when you use pass by name in this question,you can use "var" to access the parameter you passed in main or other scopes,but don't need to declare a new variable,it's a way of saving memory(no additional memory storage).

sorry for using English,there's sth wrong with my chinese IME.^-^本回答被提问者采纳

C++中函数形参为“类型 *&变量名”什么意思?
{ \/\/未释放内存前 -> p1 Address : 0012FDDC p1 value : 003429B8,在这里,p1它也是一个变量,既然是一个变量,那么它将会以值的传递,把外部变量p1传到栈内,在栈内产生一个地址:0012FDDC,当然,它的值不会变仍然是指向堆地址:003429B8 。delete p1; \/\/系统回收p1值的地址003429B8处...

C++ 中形参中的 *& 是什么意思?
前面的&表示引用,struct stacktype *&s 这条语句就是stacktype指针变量的引用。C++代码里面使用结构体的时候可以省略struct的,最好不要加上struct。 你的这段代码应该是数据结构课本上的吧!

C++:参数 自变量 函数签名 分别表示什么
参数是小括号里的部分,叫做形参变量,也要在其前面表明参数类型;int 是函数类型,它确定了函数的返回值类型为整型,main为函数名,即函数的名称。

函数的参数里带*&是什么意思?
函数的参数里带*& 代表的是指针类型的引用。这里传入的是一个(LNode*)指针。&变量引用的申明(如:String & rs = string1;)是C++才有,C语言不可这么写。LNode *&1st是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址。在...

形参中&和*的区别
如果是定义的形参,那么*前面应该加上类型名,因为C++是强类型语言。而p就是形参的参数名。而&q这种格式比较明显的看出这是一个实参,因为&的左边没有类型说明符,表示这个函数在声明(定义原型)的时候已经确定了这第二个参数的类型。如果以int为例,那么这个函数原型可以这么写:void fun(int * p,...

C++ 中 *&符号连用是什么意思
但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。【例2】:void swap(int &p1, int &p2) \/\/此处函数的形参p1, p2都是引用 { int p; p=p1; p1=p2; p2=p; } 为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实参进行调用即可,而不需要...

数据结构 C语言 中参数传递的*与&用法
&,在c++中作为引用形参,c中是不能这样用的,数据结构中使用的类c写的,为了保持兼容性就是用了引用形参!!!**,是用的c中的双指针的问题,就是说指向指针的指针,即指针的内容在函数中可以被改变,如果用单指针指针的话,对指针的改变不会被带出函数!!这一点是难点,我以前也在这而迷惑了...

C++ 在函数内给变量起别名是什么意思?
像你举的这种例子很少见 这种形式经常在函数参数中出现 譬如 void function(type& T);形式 最大的好处就是可以直接改变变量的值 而在c时代中,则必须通过指针或者返回值来改变 如果我们来写一段变量交换值的函数代码 c中的:void swap(int* a,int* b){ int t=*a;a=*b;b=t;} c++中的:...

c++中**&的意思
&是引用 &是指针的引用 &就是指针的指针的引用 那个x就是对指向T类型的指针的指针的引用

C++在定义函数时,在传递的参数后面加上“&”是什么意思
没有这个形式,写反了,应该是:bool start(char& strr) {} 这是说,函数的形参是你传递的实参的一个别名(引用)。什么叫别名呢?那就是一损俱损,一荣俱荣,完全可以当作同一个东西对待。说白了,函数里对引用参数的改变会影响到调用这个函数的程序中实参的值。

相似回答