值传递、指针传递、双指针传递、解指针,形参实参变化经典问题(牛客刷题补充)

照常每天刷题,遇到了一个关于指针传参的经典题目,感觉很好,对基础知识有了更加深刻的认识。

运行下面这段程序之后,输出在屏幕上的结果是:

#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的地址

关于指针问题,是学习的基础和常用知识点,个人一直觉得很有意思,如有不懂的地方和发现不规范的地方,欢迎大家一起交流进步。^ - ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值