照常每天刷题,遇到了一个关于指针传参的经典题目,感觉很好,对基础知识有了更加深刻的认识。
运行下面这段程序之后,输出在屏幕上的结果是:
#include<stdio.h>
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 a=1, b=2, c=3, *p=2 √
B a=101, b=2, c=3, *p=2
C a=101, b=101, c=2, *p=3
D a=1, b=101, c=2, *p=3
官方解析:
函数foobar中的a是按值传递,因此在函数中的修改不会引起主函数中的变化。
函数中b传递的是主函数中b的指针,语句b = p,其中p指向的是函数foobar内局部变量a的地址,让传递过去的指针换了指向的数据,原来指向的数据(主函数中的b)不会有影响。
如果这里是*b= *p那么主函数中的b也要相应变化。
函数中的c传递的是双重指针,*c = b,也就是让主函数中的p指针指向了主函数中的b的地址
在函数foobar中对指针的变化没有影响到主函数,只是让双重指针更换了指向而已
分析参数:a b c p
①值传递
a是值传递,不会对主函数有什么影响,a的值不变 a = 1;
②指针传递
int *b = &b; //传送的b的地址
函数形参 主函数实参
int* b = &b;
//函数内:
(函数形参)b = (函数形参)p // 即b,p存放的均是a的地址
/*但是函数里面的变化,只是形参b发生了变换,主函数中的b不会有影响*/ 故 b=2
//(指针传递要想有影响 *b = *p,比如经典题目,利用指针传参交换两个数的值)
③双指针传递
函数形参 主函数实参
int **c = &p; //c存放p的地址
*c就是 p
c是int**型, *c是int * 型, 形参b也是int *型
*c = b // *c ,b存放的是主函数实参b的地址
即主函数中的p指针,存放主函数实参b的地址,故*p = b *p = 2;
补充两指针相等的基础知识
int a = 1, b =2;
int *p = &a, *q = b;
将q赋值给p
即 p = q,即将q中的内容给p
即p和q中存放的都是b的地址
关于指针问题,是学习的基础和常用知识点,个人一直觉得很有意思,如有不懂的地方和发现不规范的地方,欢迎大家一起交流进步。^ - ^