C++中的函数参数有三种传递方式:值传递、指针传递和引用传递。。。
今天看数据结构,有一个建链表函数调用voidInitList(sNode*&HL){HL=NULL;}难道这是指针引用??????不是用指针就行了么,为什么还要加上一个引...
今天看数据结构,有一个建链表函数调用
void InitList(sNode*&HL)
{
HL=NULL;
}
难道这是指针引用??????不是用指针就行了么,为什么还要加上一个引用符号,请明示下,谢谢。。。 展开
void InitList(sNode*&HL)
{
HL=NULL;
}
难道这是指针引用??????不是用指针就行了么,为什么还要加上一个引用符号,请明示下,谢谢。。。 展开
展开全部
单独指针只是传递的指针的值,指针形参的变化与调用的实参无关,只有用指针的引用才能将函数体内的初始化值传递回去
更多追问追答
追问
能不能详细点,不是很懂。。单独指针不也能改变原实参的值么,,指针引用也可以,作用不都是一样的么???
追答
1、所谓传递指针,只是传递指针的值的意思就是这样:如果有变量a,传递进去的是a的地址,注意这个值是复制给了函数体内的形参,在函数体内可以通过这个地址绕回来修改a的内容,即使修改了函数体内的形参,但是并不能就因此修改a的地址
2、所谓引用从原则而言,则是变量自己,当然在函数体内修改就会作用到原来的变量上,具体设计到引用的实现也可以是指针。
你的要求是在函数体内修改一个指针变量的值,依照上面的原则,必须要传递该指针变量的地址(或者指针变量自己)才可以在函数体内间接(引用可以说是直接)修改该指针变量的值,所以只有传递指针的指针(或者指针的引用)才行
展开全部
上面的程序,说白了还是指针,只不过是二级指针,看以下例子:
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中都是用二级指针的,,二级指针的作用不是修改指针的内容而是修改指针本身,,,
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;
等等等。。。。
改用引用,很多危险操作编译时就会报错的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
二维指针的引用
追问
应该是一级指针的引用,,即为二级指针吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-03-11
展开全部
ewq
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询