指针的按值传递,按址传递以及指针的引用

指针作为形参,最常用的是按址传递,如下:

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的操作,因此成功。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值