指针作为函数的参数

假装没事ソ 提交于 2019-12-27 17:24:41

在 C/C++ 语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。

指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值

例子如下:

  • 当指针作为形参时,我们仅仅是用于改变指针所指向变量(实参)的值时,这是可以改变的。

在这里插入图片描述

int a = 3;
int *p = &a;
void func1(int* val){
	*val = 10;
}
int main(){
	cout<<*p<<endl;	//输出是3;
	func1(p);
	cout<<*p<<endl;	//输出是10;
}
  • 但是要明确的是,当对指针本身进行操作时,其与普通的形参是一样的,没有任何特殊之处。
    就是指针内存单元存放的的其指向地址的值。
int a = 3;
int b = 9;
int *p = &a;
void func1(int* val){
	val = &b;
}
int main(){
	cout<<*p<<endl;	//输出是3;
	func1(p);
	cout<<*p<<endl;	//输出是3;
	/*
		对指针本身所存储的变量的更改,只限于形参形式。
	*/
}
  • 当指针作为形参,而我们要去对其进行实际的操作时。需要采用两种方法:
    • 传入指针的引用
    • 借助高一级指针
      在这里插入图片描述
int a = 3;
int *p = &a;

void func1(int *&pfather);//指针的引用
void func2(int **pfather);//二级指针

int main(){
	cout<<*p<<endl;	//输出是3;
	func1(p);
	cout<<*p<<endl;	//输出是1;
	func2(&p);
	cout<<*p<<endl;	//输出是9;
	/*
		对指针本身所存储的变量的更改,只限于形参形式。
	*/
}
void func1(int*& pfather){
	int g = 1;
	pfather= &g;
}
void func2(int** pfather){
	int b = 9;
	*pfather= &b;
} 

这也就是为什么在使用函数来构建二叉树时需要使用二级指针:

struct TreeNode {
	char val;
	struct TreeNode *lchild, *rchild;
	TreeNode(char x) :val(x), lchild(NULL), rchild(NULL) {}
};

void CreatBTree(TreeNode** root) {
	char data;
	cin >> data;
	
	if (data == '#')
		*root = NULL;
	else {
		*root = new TreeNode(data);
		CreatBTree(&((*root)->lchild));		//这里是新建一个lchild,而lchild是一个指针,对指针操作需要二重指针。
		CreatBTree(&((*root)->rchild));
	}
	return; 
}
int main(){
	TreeNode* root = NULL;
	//这里要对根节点指针(内部存储的内容)进行操作,生成左右子树
	//因此需要使用二级指针来使root真正的改变。
	//否则所有改变都是形参的变化无法影响到实参本身。
	CreatBTree(&root);
}

创作不易,版权归@Soul·Top所有,转载需得到许可。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!