说明:笔者水平有限,这当做个人学习C语言的笔记,如有错误欢迎指出和讨论。

题目

求程序运行结果

#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);
}

答案

使用DEV C++运行,结果如下:

题解

为了方便理解,增加三行代码在“int *p = &c”后面

    int *p_a=&a;int *p_b=&b;int **p_c=&p;

断点设置在“foobar(a, &b, &p);”,结果如图:

也就是a的地址为70fe04,b的地址为70fe00,c的地址为70fdfc。c的地址的地址为70fdf0,这里也可以看出双重指针的含义。

若把断点设置在“int *p = &a”,运行结果如图:

也就是函数foobar中的b为main中b的地址,c为main中c的地址的地址。

继续执行到“b=p”。如图:

a的值变成了101,因为p是指向a的指针,“*p = 101”改变了a的值。c的值没有变,改变的是c指向的变量的值,原本指向的是main函数中c的地址,变成了main函数中b的地址。foobar函数中b的值变成了70fdc0,即p的值,但这没有改变main中b的值。

因此实际改变的是地址,main中的a、b、c没变,p变成了b的地址,因此*p输出b。

如果修改一行,把"b=p"改成"*b = *p",才能改变b:

void foobar(int a, int *b, int **c)
{int *p = &a;*p = 101;*c = b;*b = *p;
}

运行结果:

还有最后一个问题,为什么a仍然是1而不是101,我们在"foobar(a,&b,&p)"后添加:

printf("&a=%x,&b=%x,&c=%x",&a,&b,&c);

运行结果:

实际上b的地址也没用发生改变,即使运行了"b = p"。

为了更直观的分析问题,运行如下代码:

#include<stdio.h>
void aa(int a)
{a=2;
}int main()
{int a = 1;aa(a);//printf("a=%d, b=%d, c=%d, *p=%d\n", a, b, c, *p);printf("a=%d",a);return (0);
}

结果为1,即使aa函数中让a=2。
再运行如下代码:

void aa(int * a)
{*a=2;
}int main()
{int a = 1;aa(&a);//printf("a=%d, b=%d, c=%d, *p=%d\n", a, b, c, *p);printf("a=%d",a);return (0);
}

运行结果:

通过指针来改变a的值,结果为2。

同理,指针值需要二级指针来改变。概括来说,用函数改变一个数据需要一级指针,改变一个一级指针需要二级指针。

牛客网C语言题解1-指针相关推荐

  1. 牛客网C语言题目练习

    牛客网C语言专题练习 BC1 实践出真知 BC2 我是大V BC3 有容乃大 BC6 小飞机 BC7 缩短二进制 BC8 十六进制转十进制 BC9 十六进制转十进制 BC11 学生基本信息输入输出 B ...

  2. 牛客网sql练习题解(22-32)

    文章目录 简介 NO.22 NO.23 NO.24 NO.25 NO.26 NO.27 NO.28 NO.29 NO.30 NO.31 NO.32 简介 往期文章: 牛客网sql练习题解 (1-11) ...

  3. 牛客网sql练习题解(12-21)

    文章目录 简介 NO.12 NO.13 NO.14 NO.15 NO.16 NO.17 NO.18 NO.19 NO.20 NO.21 简介 按时来更,感觉题目不是很难,不过我有一个感觉就是虽然题目简 ...

  4. 牛客网_Go语言相关练习_选择题(2)

    注:题目来源均出自牛客网. 一.选择题 Map(集合)属于Go的内置类型,不需要引入其它库即可使用. Go-Map_菜鸟教程 在函数声明中,返回的参数要么都有变量名,要么都没有. C选项函数声明语法有 ...

  5. 牛客网C语言考试输入输出问题

    如果是用C语言考试,且HW的需要自己写输入输出的,请注意. 以下绝对不能用 void main() { return ; } 图省事不写返回值,但是会导致网站一直报错,输出无法正常输出,fflush( ...

  6. 牛客网c语言刷题130,开篇入门刷题,战胜对编程的恐惧,适合初学者食用。

    大一,大二初学者训练题 1. BC1-实践出真知 2. BC2-我是大V 3. BC3-有容乃大 4. BC7-缩短二进制 5. BC19-反向输出一个四位数 6. BC28- 大小写转换 本文所有题 ...

  7. 牛客网C语言刷题(指针篇)

    ✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!

  8. 牛客网C语言编程初学者入门训练135题

    文章目录 1.实践出真知 2.我是大V 3.有容乃大 4.小飞机 5.反向输出四位数 6.大小写转换 7.缩短二进制 8.十六进制转十进制 9.printf的返回值 10.成绩输入输出 11.学生基本 ...

  9. 牛客网C语言入门刷题(BC1 ~ BC50)

    文章目录 BC1 实践出真知 BC2 我是大V BC3 有容乃大 BC6 小飞机 BC7 缩短二进制 BC8 十六进制转十进制 BC9 printf的返回值描述 BC10 成绩输入输出 BC11 学生 ...

最新文章

  1. 快来学习Redis 分布式锁的背后原理
  2. Science-2018-微生物群落的构建过程具有趋简性
  3. JAVA SAX解析XML字符串实例
  4. 前端面试题目及答案(欢迎拍砖)
  5. 杰思安全获数千万元A+轮投资,绿盟科技领投,德联资本跟投
  6. java ancestor_java – 家谱祖先查找算法
  7. dropout比率最好的设置为0.5,因为随机生成的网络结构最多
  8. Linux 上扩展swap分区
  9. kdbg调试linux汇编,Ubuntu 16.04安装Kdbg替代Insight实现汇编的调试
  10. 放学默示录Ⅰ:来!抠奖 移动游戏策划案
  11. greensock包使用
  12. Spring07----Bean的作用域
  13. mysql主从错误1007_mysql主从错误:1032
  14. oppo9s刷机教程_oppor9s怎么自己刷机很简单的技巧
  15. VMware如何开机自动启动虚拟机也启动
  16. 计算物体自由下落的距离
  17. CDH 端口未授权访问:hdfs-50070, yarn-8088, jetty漏洞修复
  18. 福州大学计算机专业排名2018,福州大学2019年排名第64位 较2018年下降3名
  19. 树莓派 树莓派 编c++_为什么树莓派仍然是教育的白骑士
  20. jQuery移除或禁用html元素的点击事件

热门文章

  1. python数据挖掘实战笔记——文本挖掘(9):相似文章推荐
  2. erp怎样修改服务器,erp服务器怎么设置
  3. 纽曼皮尔逊准则Matlab实现,噪声恒虚警处理电路的计算机仿真
  4. ehcache 冲突_ehcache版本冲突
  5. 数据可视化策略_从无见识到有见识的四种设计有影响力的数据可视化的策略
  6. JCreator Pro
  7. 用单片机解码红外遥控器
  8. STD高级语言程序设计第九天(满分答案,附赠本人程序的解析及坑点标识)
  9. Python分析《蜘蛛侠:英雄远征》11万条猫眼评论
  10. 自动化生产线中的生产节拍主要由工艺操作时间和辅助作业时间所组成