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中对指针的变化没有影响到主函数,只是让双重指针更换了指向而已

总结
改变一个数据需要一级指针,改变一个一级指针需要二级指针,依次类推,引用就是一个别名