编程语言
首页 > 编程语言> > C++给函数传参时用一级指针还是用二级指针?

C++给函数传参时用一级指针还是用二级指针?

作者:互联网

在需要给函数传入指针的时候,经常对一级指针和二级指针的事情摸不着头脑,基本上是玄学编程。现在作一个简单总结:
1、如果传入的是一个一级指针,那么可以修改值;
2、如果传入的是一个二级指针,那么可以修改一级指针。

测试代码:

#include <iostream>
using namespace std;
typedef struct testNode {
	struct testNode *t1, *t2;
	int int_t;
}testNode, *test;

void Init_1(test* my_test) {
	*my_test = (testNode *)malloc(sizeof(testNode)); // 修改my_test(也即传入的那个testNode* my_testNode)的值
	cout << (*my_test) << endl; // 此时my_testNode的值发生改变,即指向了上面刚申请出来的那块地址
	(*my_test)->int_t = 4; // my_testNode被修改前指向的那块地址的int_t还是3,这里只是修改了新的地址的int_t为4
}

void Init_2(testNode* my_testNode) {
	my_testNode = (testNode *)malloc(sizeof(testNode));
	cout << my_testNode << endl;
	/*
	 若把上面的两句注释掉,则下面这个是修改了int_t
	 若上面两句没注释掉,当该函数结束时,my_testNode还是原来的那个值,原来的那个my_testNode->int_t自然也就没变
	 仅仅是该函数内的my_testNode的值所对应的那块地址的int_t被改成了5,而函数结束后,那块地址就找不到了
	*/
	my_testNode->int_t = 5;
}

int main()
{
	testNode* my_testNode = NULL;// 不写NULL,就是野指针了,要避免
	//cout << my_testNode << endl;
	my_testNode = (testNode *)malloc(sizeof(testNode)); // malloc申请到一块空间后,返回这个空间的首地址给到my_testNode
	cout << my_testNode << endl;
	my_testNode->int_t = 3; // 此时my_testNode有内存了,就可以操作它,修改int_t了
	cout << my_testNode->int_t << endl;
	
	Init_1(&my_testNode); // 传入的是一个二级指针,那么意味着可以修改一级指针,即修改my_testNode的值
	cout << my_testNode << endl;
	cout << my_testNode->int_t << endl;
		
	/*
	 如果没有上面的初始化即my_testNode = (testNode *)malloc(sizeof(testNode)); 或者Init_1(&my_testNode);
	 则以下第三行就会出错了,因为my_testNode只在函数体Init_2内不是NULL,这个函数结束后,
	 my_testNode就变回NULL了,操作NULL指针那肯定崩溃啊
	*/
	Init_2(my_testNode); // 传入的是一个一级指针,那么意味着只可以修改值
	cout << my_testNode << endl;
	cout << my_testNode->int_t << endl;

	return 0;
}

对上面的代码作以下说明:
1、在函数中使用malloc申请的内存是在堆区的,不像栈区内存那样在函数结束后就马上释放,但是像Init_2中那样的用法,在函数结束后就找不到这块区域了。
2、Init_1的意思是说,要修改my_testNode的值,并且希望在函数结束后这个值仍然有效,即直接让my_testNode指向另一块内存,然后修改这块内存的int_t字段。则传入my_testNode的地址,对这个地址解引用来修改my_testNode就行。借助下图理解:

在这里插入图片描述
本来仅仅是想找一下一级指针和二级指针的区别,稀里糊涂地敲下了上面那堆代码,没想到还学到了一些别的东西,实践出真知诚不我欺。

以上仅作为个人学习总结,因水平有限,无法保证理解的正确性。(逃

标签:int,test,C++,修改,传参时,testNode,my,指针
来源: https://blog.csdn.net/weixin_45884734/article/details/117371994