使用一级指针不能将变量带出
void test(int *p)
{
static int nub = 10; /*使用static是保证函数结束, 变量依然存在, 不然即使将它带出来, 函数结束时这片内存已经被释放了就没有意义了*/
p = &nub;
}
int main(void)
{
int *p = NULL;
test(p);
printf("%d",*p);
return 0;
}
如上图所示: 调用函数之后,虽然在test函数内进行了一系列的转换,可是main函数中的p中存放的还是0地址,所以使用一级指针无法将变量从函数中带出
原因:
其实很简单, 我们进行值传递的时候,传进去的值在函数内部进行怎样的改变都不会影响外面的值,值传递就是将变量中存储的东西传递给形参。
我们使用地址传递,可以实现函数内部发生改变,外面的值也发生改变,我们传进去的是指针指向变量的地址,通过*对此地址进行操作,操作的是同一片内存,所以自然会影响到外面的值。
而我们传入的一级指针,只是传的是nub的地址,而不是指针变量p自己的地址,所以函数内部的指针变量存储的地址怎么变都不会影响外面的值,所以无法将带出变量。
使用二级指针将值带出
#include <iostream>
#include <Windows.h>
void test(int** p2)
{
static int nub = 10; /*使用static是保证函数结束, 变量依然存在, 不然即使将它带出来, 函数结束时这片内存已经被释放了就没有意义了*/
*p2 = &nub;
}
int main(void)
{
int* p = NULL;
test(&p);
system("pause");
return;
}
如上图所示, 在test函数执行了相关语句之后main函数中的指针p已经指向了nub,就可以对nub进行访问,实现了将变量带出。(其实,原理和值传递与地址传递那块是一样的,就是多了一层)。