指针的引用

来源:互联网 发布:奥拉朱旺生涯数据 编辑:程序博客网 时间:2024/06/03 14:58

创建链表的时候用的到

Csdn问1

int ival = 1024;
int *pi = &ival;
int *&ptrVal2 = pi;
最后这一句它说是指向指针的引用,左看右看也没看明白,
哪个给我解释下,谢谢!

回复:

引用就是给一个变量起一个别名.
指向指针的引用, 就是给一个指针变量起一个别名...

ptrVal2 就相当于pi了..对ptrVal2的操作就是对pi的操作

Csdn问2

我们的数据结构课上讲到链表,比如在链表初始化的时候:
InitList(LNode *&HL){//这里老师让我们用*&,我十分不理解*&的作用
HL=NULL;
}

指针的引用

因为在链表初始化的时候,
你需要对这个传递进来的 head 指针进行内存分配等操作,
要么传递指向指针的指针进来,
要么使用指针的引用,
否则在 InitList 中进行的内存分配不能反馈到实参指针中, 函数无效,初始化失败,并造成内存泄漏,在函数内部new之后分配了内存空间,但是head此时还是NULL,因为函数的形参是值类型而非引用类型,函数形参的改变无法影响到实参的值就是head的值造成函数无效,不仅如此,由于函数退出时指针也就自动从栈中退出。指针已经找不到了,但是指针指向的内存是new出来的也就是从堆上分配的,所以不会跟着函数的退出而退出,这样就造成指针指向的内存还在,但是指向该内存的指针已经无法找到,从而造成了内存泄漏

#include <iostream>

#include <string>

using namespace std;


void ptrswap(int *&v1,int *&v2){//指向指针的引用是某一指针的别名,同变量的引用一样,可以实现对传递给形参的实参数值的交换

int *temp=v2;//指针别名,当然以指针的形式来应用
v2=v1;
v1=temp;

}

void ptrswap2(int *v1,int *v2){//利用指针进行数值交换,改变的只是形参的指向,实参的值保持不变;
int *temp=v1;
v2=v1;
v1=v2;
}

int main(){

int i=10;
int j=20;
int *pi=&i;
int *pj=&j;

cout<<"before swap: pi="<<*pi<<" pj="<<*pj<<endl;

ptrswap(pi,pj);

cout<<"after swap: pi="<<*pi<<" pj="<<*pj<<endl;

int i2=10;
int j2=20;
int *pi2=&i2;
int *pj2=&j2;

cout<<"before swap: pi2="<<*pi2<<" pj2="<<*pj2<<endl;

ptrswap2(pi2,pj2);

cout<<"after swap: pi2="<<*pi2<<" pj2="<<*pj2<<endl;

system("pause");

return 0;
}

总结:根本原因是因为函数的形参是值类型而非引用类型,函数形参的改变无法影响到实参的值。引用就是给一个变量起一个别名. 指向指针的引用, 就是给一个指针变量起一个别名。

再看看下面的这个csdn提问:

void Insert(Node*& head) //为什么用指针引用?有什么好处?
{
Node* p=new Node;
strncpy(p->str,"marit",20);
head->str[19]='\0';
if(!head){
head = p;
p->next = NULL;
return;
}
if(!strcmp(head->str, "jone")){
p->next = head;
head = p;
return;
}
Node* sp;
for(sp=head; sp->next&& strcmp(sp->next->str,"jone"); sp=sp->next);
p->next = sp->next;
sp->next = p;
}
void main()
{
Node* p;
Node* x=new Node;
strncpy(x->str,"hello",20);
x->next = NULL;
p =x;
x=new Node;
strncpy(x->str,"good",20);
x->next = p;
p=x;
x=new Node;
strncpy(x->str,"jone",20);
x->next = p;
p=x;
insert(p);
.
.
.
.