返回指针的引用,不是很懂

djh512 2011-02-28 06:10:59

Node*& getp(int pos)
{
if(pos<0||pos>=len)
pos=len;
if(pos==0)
return head;
if(head==NULL)
return head;
Node* p = head;
for(int i=0;i<pos-1;i++)
p=p->next;
return p->next;
}
bool insert(T d,int pos=0)
{
Node* nd = new Node(d);
Node* &p = getp(pos); //这一句为什么要*p的引用
nd->next = p;
p = nd;
len++;
return true;
}

如上代码 Node* &p = getp(pos); 为什么要引用 不是很懂
Node * p = getp(pos); p不还是那个值么?
...全文
248 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxldfang 2011-02-28
  • 打赏
  • 举报
回复
p是引用,修改了p就是修改了所引用的东东!!!
雪人2015 2011-02-28
  • 打赏
  • 举报
回复
作者的目的是希望将链表的串联工作让外界处理。那么返回引用相当于建立相应变量的别名,可以直接修改返回的节点本身。

不过我觉得不值得提倡。
zhzh89 2011-02-28
  • 打赏
  • 举报
回复
这个地方返回引用是不是有作为左值的考虑?比如说下面的代码片段:
List list;
T d;
Node* nd = new Node(d);
list.getp(1) = nd;

一般函数是不能作为左值使用的,因为它是常量不能被赋值,但是如果函数的返回值是个引用,类似list.getp(1) = nd;就合法了。
pathuang68 2011-02-28
  • 打赏
  • 举报
回复
昵称很不好取 2011-02-28
  • 打赏
  • 举报
回复
    Node* getp(int pos) //别返回引用
{
if(pos<0||pos>=len)
pos=len;
if(pos==0)
return head;
if(head==NULL)
return head;
Node* p = head;
for(int i=0;i<pos-1;i++)
p=p->next;
return p;
}
bool insert(T d,int pos=0)//这个函数要判断下以防止getp返回NULL
{
Node* nd = new Node(d);
Node* p = getp(pos);
if(p == NULL){
head = nd;
head->next = NULL;
}
else{
nd->next = p->next;
p->next = nd;
}

len++;
return true;
}
pengzhixi 2011-02-28
  • 打赏
  • 举报
回复
原来是List里面的成员函数,那这里的引用主要是希望插入的节点能够影响到head头指针。否则插入的节点都是对头结点的副本进行插入
太乙 2011-02-28
  • 打赏
  • 举报
回复
        Node* &p = getp(pos);    //这一句为什么要*p的引用    

如果不是引用的话,getp返回的是一个指针的副本,这么说吧:

int* p = NULL;
int*& fun()
{
p = new int;
return p;
}

int* pp = fun();
*pp = 10;
pp = new int();
*pp = 100;//这个之后,*p=10;
如果:
int*& pp = fun();
*pp = 10;
pp = new int();
*pp = 100;//这个之后,*p=100;


太乙 2011-02-28
  • 打赏
  • 举报
回复
如上代码 Node* &p = getp(pos); 为什么要引用 不是很懂

因为你要修改的是getp返回的本身指针,而不是指针的副本!
gladstonejay 2011-02-28
  • 打赏
  • 举报
回复
标记

等高手
djh512 2011-02-28
  • 打赏
  • 举报
回复
结果不一样额
有引用 结果
[ 4 3 2 1 5 ]
无引用
[]

所有代码如下

#include <iostream>
using namespace std;

typedef int T;
class List
{
struct Node
{
T data;
Node* next;

Node(T data=T()):data(data),next(NULL){}
};
Node* head;
int len;
public:
List():head(NULL),len(0)
{
}
Node*& getp(int pos)
{
if(pos<0||pos>=len)
pos=len;
if(pos==0)
return head;
if(head==NULL)
return head;
Node* p = head;
for(int i=0;i<pos-1;i++)
p=p->next;
return p->next;
}
bool insert(T d,int pos=0)
{
Node* nd = new Node(d);
Node* p = getp(pos);
nd->next = p;
p = nd;
len++;
return true;
}
void travel()
{
Node* p = head;
cout << "[ ";
while(p!=NULL)
{
cout << p->data << ' ' ;
p=p->next;
}
cout << "]" << endl;
}
void clear()
{
Node*p = head;
while(p!=NULL)
{
p=p->next;
delete head;
head=p;
}
len=0;
head=NULL;
}
~List()
{
clear();
}
};

int main()
{
List lst;
lst.insert(1);
lst.insert(2);
lst.insert(3);
lst.insert(4);
lst.insert(5,-1);
lst.travel();
return 0;
}


pengzhixi 2011-02-28
  • 打赏
  • 举报
回复
额 这里用不用指针的引用都没关系。

64,632

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧