指针mp原本指向变量a,希望使用子函数改变指针指向,使其指向变量b。判断以下代码是否正确?
// 测试用函数调用 改变指针指向
#include <stdio.h>
int a = 520;
int b = 100;
void changePrt(int *sp)
{
sp = &b;
}
int main(void)
{
int *mp = &a;
printf("*mp_before = %d\n", *mp);
changePrt(mp);
printf("*mp_after = %d\n", *mp);
return 0;
}
期待结果为:
*mp_before = 520
*mp_after = 100
但实际上是:
*mp_before = 520
*mp_after = 520
仔细分析代码可以知道,指针sp是局部变量,这里只是使用局部指针变量接收了mp的值,也就是变量a的地址,语句sp = &b
改变的是局部变量的值,不会影响mp的指向。
正确做法:使用二级指针
改变指针指向也就是改变指针的值,根据改变谁的值就传递谁的地址,因此应该传递指针的地址,使用二级指针接收。
// 测试用函数调用 改变指针指向
#include <stdio.h>
int a = 520;
int b = 100;
void changePrt(int **sp)
{
*sp = &b;
}
int main(void)
{
int *mp = &a;
printf("*mp_before = %d\n", *mp);
changePrt(&mp); // 要修改指针的值,因此要传入二级指针
printf("*mp_after = %d\n", *mp);
return 0;
}
使用二级指针sp接收指针mp的地址,*sp=&b
,通过对mp的地址解引用,改变了mp的值,调用结束后,局部变量sp消失,但mp的值被改变了。
结果:
![](https://img.haomeiwen.com/i18864448/865707ee04d4473d.png)
网友评论