二级指针的作用 -- 将变量从函数中带出

使用一级指针不能将变量带出

void test(int *p)
{
   static int nub = 10; /*使用static是保证函数结束, 变量依然存在, 不然即使将它带出来, 函数结束时这片内存已经被释放了就没有意义了*/
   p = &nub;
}

int main(void)
{
  int *p = NULL;

  test(p);

  printf("%d",*p);

  return 0;
}

 二级指针的作用 -- 将变量从函数中带出_第1张图片

如上图所示:  调用函数之后,虽然在test函数内进行了一系列的转换,可是main函数中的p中存放的还是0地址,所以使用一级指针无法将变量从函数中带出 

原因:    

其实很简单, 我们进行值传递的时候,传进去的值在函数内部进行怎样的改变都不会影响外面的值,值传递就是将变量中存储的东西传递给形参。 

我们使用地址传递,可以实现函数内部发生改变,外面的值也发生改变,我们传进去的是指针指向变量的地址,通过*对此地址进行操作,操作的是同一片内存,所以自然会影响到外面的值。

而我们传入的一级指针,只是传的是nub的地址,而不是指针变量p自己的地址,所以函数内部的指针变量存储的地址怎么变都不会影响外面的值,所以无法将带出变量。

使用二级指针将值带出

#include 
#include 

void test(int** p2)
{
	static int nub = 10;  /*使用static是保证函数结束, 变量依然存在, 不然即使将它带出来, 函数结束时这片内存已经被释放了就没有意义了*/
	*p2 = &nub;
}

int main(void)
{
	int* p = NULL;

	test(&p);

	system("pause");

	return;
}

 

 二级指针的作用 -- 将变量从函数中带出_第2张图片

 如上图所示, 在test函数执行了相关语句之后main函数中的指针p已经指向了nub,就可以对nub进行访问,实现了将变量带出。(其实,原理和值传递与地址传递那块是一样的,就是多了一层)。

你可能感兴趣的:(算法,开发语言)