指针作为形参,最常用的是按址传递,如下:
swap(int a, int b)
{
int t = a;
a = b;
b = t;
}
swap1(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
int main()
{
int a=2, b =3;
swap(a,b);//不能实现a和b值的互换
swap(&a,&b);//可以实现a和b值的互换
return 0;
}
但是当传入的参数也需要为指针的时候,就出现问题了:
首先定义一个Node类:
class Node
{
public:
int data;
Node *next;
};
定义一个类中的方法:
bool singleLinkedList::locatePri(int i,Node *pNode)
{
if (i<0 || i>=m_iLength)
{
cout << "index error" << endl;
return false;
}
Node *currentNode = m_pSingleList;
for (int k = 0; k<i; k++)
{
currentNode = currentNode->next;
}
pNode = currentNode;
cout << "pNode->data:" << pNode->data << endl;
return true;
}
这个时候想要按址传递,但是
Node *priNode=new Node;
if (!locatePri(i, priNode))
{
return false;
}
cout <<" priNode->data:"<<priNode->data << endl;
得到结果为:
pNode->data:3
priNode->data:-842150451
也就是没有按址传成功。
而
pNode = currentNode;
改为
pNode->data = currentNode->data;
则可以成功,但是问题是调用函数后需要用到
priNode->next
因此,查阅资料后发现应该使用指针的引用,即:
bool singleLinkedList::locatePri(int i,Node *&pNode)
其他不变。发现使用成功。
理解如下:
指针传递只是传了一个地址copy, 在函数内部改变形参所指向的地址,不能改变原实参指向的地址,仅可以通过修改形参地址的内容,来达到修改实参内容的目的,所以如果想通过被调函数来修改原实参的地址或给重新分配一个对象都是不能完成的,只能使用双指针或指针引用。
也就是说,原代码中:
bool singleLinkedList::locatePri(int i,Node *pNode)
调用该函数传递的实参指针 priNode会拷贝一个新的形参指针pNode,两个指针自己的地址不同,但是指向同一个地址。
pNode->data = currentNode->data;
上面语句,pNode修改了指针指向地址的内容,因此priNode访问指向地址的内容时,成功改变。
而原语句:
pNode = currentNode;
改变了pNode指针指向的地址,因此 priNode和pNod不在指向同一个地址,因此无法改变指向同一个地址的内容。
而改为:
bool singleLinkedList::locatePri(int i,Node *&pNode)
传入的是priNode的引用,也就是说, priNode和pNod地址相同,指向的地址也相同,因此对pNod的操作就是对priNode的操作,因此成功。