C++中的函数参数有三种传递方式:值传递、指针传递和引用传递。。。

今天看数据结构,有一个建链表函数调用voidInitList(sNode*&HL){HL=NULL;}难道这是指针引用??????不是用指针就行了么,为什么还要加上一个引... 今天看数据结构,有一个建链表函数调用
void InitList(sNode*&HL)
{
HL=NULL;
}
难道这是指针引用??????不是用指针就行了么,为什么还要加上一个引用符号,请明示下,谢谢。。。
展开
 我来答
chiconysun
2011-03-11 · TA获得超过2.2万个赞
知道大有可为答主
回答量:5410
采纳率:92%
帮助的人:2567万
展开全部
单独指针只是传递的指针的值,指针形参的变化与调用的实参无关,只有用指针的引用才能将函数体内的初始化值传递回去
更多追问追答
追问
能不能详细点,不是很懂。。单独指针不也能改变原实参的值么,,指针引用也可以,作用不都是一样的么???
追答
1、所谓传递指针,只是传递指针的值的意思就是这样:如果有变量a,传递进去的是a的地址,注意这个值是复制给了函数体内的形参,在函数体内可以通过这个地址绕回来修改a的内容,即使修改了函数体内的形参,但是并不能就因此修改a的地址
2、所谓引用从原则而言,则是变量自己,当然在函数体内修改就会作用到原来的变量上,具体设计到引用的实现也可以是指针。
你的要求是在函数体内修改一个指针变量的值,依照上面的原则,必须要传递该指针变量的地址(或者指针变量自己)才可以在函数体内间接(引用可以说是直接)修改该指针变量的值,所以只有传递指针的指针(或者指针的引用)才行
sl65agm
2011-03-11 · TA获得超过1383个赞
知道小有建树答主
回答量:734
采纳率:0%
帮助的人:587万
展开全部
上面的程序,说白了还是指针,只不过是二级指针,看以下例子:

void allocMem1(unsigned char** buf)
{
*buf = new unsigned char[100];
memset(*buf, 0, 100);
}

void allocMem2(unsigned char *&buf)
{
buf = new unsigned char[100];
memset(buf, 0xff, 100);
}

int _tmain(int argc, _TCHAR* argv[])
{
unsigned char *p1, *p2;
allocMem1(&p1);
allocMem2(p2);
}

可以发现,,函数2的效果与第一个函数是一样的,,,只不过在调用时,还有在函数体内部,把一级指针当成是一个值类型了,,但是其实就效果而言,与引用时一样的。
有点拗口,这个叫引用的指针,,比直接写二级指针可能要安全一点吧,,不过微软可不这么认为,com中都是用二级指针的,,二级指针的作用不是修改指针的内容而是修改指针本身,,,
追问
谢谢你,一言中的,,就是一个二级指针,,都怪我没看清楚。。。。可是为什么说引用的指针,,比直接写二级指针要安全一点?
追答
*buf = new unsigned char[100];
使用二级指针,需要安上述方法改变传入指针的地址,但是很多时候,开发者会混淆对象与指针的概念,,会出现以下危险操作:
buf = 0;
buf[0] = 0;
p2 = buf; delete []p2,,,
buf = p3;
等等等。。。。
改用引用,很多危险操作编译时就会报错的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lcjatf
2011-03-18
知道答主
回答量:13
采纳率:0%
帮助的人:0
展开全部
二维指针的引用
追问
应该是一级指针的引用,,即为二级指针吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-03-11
展开全部
ewq
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式