void foobar(int a, int *b, int **c)
{
int *p = &a;
*p = 101;
*c = b;
b = p;
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
int *p = &c;
foobar(a, &b, &p);
printf("a=%d, b=%d, c=%d, *p=%d\n", a, b, c, *p);
return (0);
}
答案
a=1, b=2, c=3, *p=2
解析
函数foobar中的a是按值传递,因此在函数中的修改不会引起主函数中的变化。 函数中b传递的是主函数中b的指针,语句b = p ,其中p指向的是函数foobar内局部变量a的地址,让传递过去的指针换了指向的数据,原来指向的数据(主函数中的b)不会有影响。如果这里是*b = *p那么主函数中的b也要相应变化。 函数中的c传递的是双重指针,*c = b,也就是让主函数中的p指针指向了主函数中的b的地址 在函数foobar中对指针的变化没有影响到主函数,只是让双重指针更换了指向而已
总结
改变一个数据需要一级指针,改变一个一级指针需要二级指针,依次类推,引用就是一个别名