一个函数的改变要影响另一个函数需要两个条件:
1、传指针。
2、解引用。
通过交换a和b数值的实例来说明其重要性:
在主函数中输入a和b的值;int a = 10;int b = 20;预期输出结果为a = 20;b = 10。
1、
明显与预期结果不符。原因:没有传指针!
2、
具体操作为:
也与预期结果不符。原因:没有解引用。
3、
与预期相符,多测试几组有代表性的数据。既传指针又解引用,交换了两个数据的值。
在这个例子中,除了1、2两种可能的问题外,还可能出现以下这种错误。
系统直接崩溃。原因:定义的tmp是一个野指针。
野指针,也叫悬挂指针,即未初始化的指针,没有访问权限的地址(指针)。
注意:野指针不是空指针。
空指针:NULL,表明当前的指针无效。注意:不能对一个无效的指针解引用。
Todo:如下程序:
int a = 10;
int *p = &a;
p = NULL;
printf("%d\n",*p);
程序会崩溃,因为不能对一个无效的指针解引用。现将其中的p = NULL;用功能函数Fun(p)替换,Fun函数为:
void Fun(int *p)
{
p=NULL;
}
这时候打印结果为*p = 10,Fun函数貌似无效。那么,问题1、为什么更改后的程序不崩溃,2、如果想使其崩溃应该如何修改?
答:因为其函数内部没有解引用。要想解引用,就必须加一个二级指针进去。
应该改为:
void Fun(int **p)
{
*p=NULL;
}
int main()
{
int a = 10;
int *p = &a;
Fun(&p);
printf("%d\n",*p);
return 0;
}