指针传参的修改写操作问题 数据结构

回顾C语言指针问题

今天数据结构课程HB问为什么指针传值要加引用才能修改原值。
C没学好的我携着晓豪大佬,凯哥大佬共同探究了指针问题。

首先我们回顾一下C语言中的指针操作

#include <iostream>
using namespace std;

int fuction(int *q)
{
	*q = 3;
	return *q;
}

int main()
{
	int a = 9;
	int *p = &a;
	cout << fuction(p) << " " << *p << " " << a << endl; 
	cout << a << endl;
	return 0;
}
输出结果:
		3 9 9
		3

指针传值应该是可以修改原值才对,第一个a的输出结果应该为3,可是为什么为9?我们四个面面相觑,以为是编译器的问题,后来多加了一条语句在后面单独输出a的值,看出来原来是因为代码的执行顺序从右到左,因此第一行输出9

解决了执行顺序问题,我们来看一下C中的指针操作

函数传入的形参是指针类型,对指针进行解引用操作后才可以改变变量地址内存储的值
接下来我们看一下最近数据结构中链表,栈等实现过程中的指针传参。

void CrtBT(BiTree *&T, char pre[], char ino[], int ps, int is, int n)
//  ps 先序遍历的起始位置
// is 中序序列的起始位置
// n 为节点个数
// pre 先序遍历的数组 
{
	if(!n) T = NULL;
	else{
		int k = Search(ino,pre[ps]);
		if(k == -1) T = NULL;
		else{
			T->data = pre[ps] - '0';
			T->lTree = (BiTree *)malloc(sizeof(BiTree));
			if(k == is) T->lTree = NULL;
			else
				CrtBT(T->lTree,pre,ino,ps+1,is,k-is);
			T->rTree = (BiTree *)malloc(sizeof(BiTree));
			if(k == is + n - 1) T->rTree = NULL;
			else
				CrtBT(T->rTree,pre,ino,ps+k-is+1,k+1,n-(k-is)-1); 
		}
	}
}

不好意思,随便找了一个树的, 看出来变量类型是我们原来没有见过的奇奇怪怪的 " *& ",传入指针变量的引用?

对比C中代码我们可以发现 function 函数中对指针进行了解引用操作,而二叉树中并没有。解释了我们传指针进函数就可以直接对指向地址变量进行修改操作的误区。

而二叉树中的传参如果不加引用同样是传入形参,不会对原指针造成影响,因此写操作要加引用符号~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值