【C语言】传指针和解引用,野指针和空指针

一个函数的改变要影响另一个函数需要两个条件:

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;
}

猜你喜欢

转载自blog.csdn.net/ifiwere/article/details/81063925