牛客网C语言题解1-指针
说明:笔者水平有限,这当做个人学习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-指针相关推荐
- 牛客网C语言题目练习
牛客网C语言专题练习 BC1 实践出真知 BC2 我是大V BC3 有容乃大 BC6 小飞机 BC7 缩短二进制 BC8 十六进制转十进制 BC9 十六进制转十进制 BC11 学生基本信息输入输出 B ...
- 牛客网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) ...
- 牛客网sql练习题解(12-21)
文章目录 简介 NO.12 NO.13 NO.14 NO.15 NO.16 NO.17 NO.18 NO.19 NO.20 NO.21 简介 按时来更,感觉题目不是很难,不过我有一个感觉就是虽然题目简 ...
- 牛客网_Go语言相关练习_选择题(2)
注:题目来源均出自牛客网. 一.选择题 Map(集合)属于Go的内置类型,不需要引入其它库即可使用. Go-Map_菜鸟教程 在函数声明中,返回的参数要么都有变量名,要么都没有. C选项函数声明语法有 ...
- 牛客网C语言考试输入输出问题
如果是用C语言考试,且HW的需要自己写输入输出的,请注意. 以下绝对不能用 void main() { return ; } 图省事不写返回值,但是会导致网站一直报错,输出无法正常输出,fflush( ...
- 牛客网c语言刷题130,开篇入门刷题,战胜对编程的恐惧,适合初学者食用。
大一,大二初学者训练题 1. BC1-实践出真知 2. BC2-我是大V 3. BC3-有容乃大 4. BC7-缩短二进制 5. BC19-反向输出一个四位数 6. BC28- 大小写转换 本文所有题 ...
- 牛客网C语言刷题(指针篇)
✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!
- 牛客网C语言编程初学者入门训练135题
文章目录 1.实践出真知 2.我是大V 3.有容乃大 4.小飞机 5.反向输出四位数 6.大小写转换 7.缩短二进制 8.十六进制转十进制 9.printf的返回值 10.成绩输入输出 11.学生基本 ...
- 牛客网C语言入门刷题(BC1 ~ BC50)
文章目录 BC1 实践出真知 BC2 我是大V BC3 有容乃大 BC6 小飞机 BC7 缩短二进制 BC8 十六进制转十进制 BC9 printf的返回值描述 BC10 成绩输入输出 BC11 学生 ...
最新文章
- 快来学习Redis 分布式锁的背后原理
- Science-2018-微生物群落的构建过程具有趋简性
- JAVA SAX解析XML字符串实例
- 前端面试题目及答案(欢迎拍砖)
- 杰思安全获数千万元A+轮投资,绿盟科技领投,德联资本跟投
- java ancestor_java – 家谱祖先查找算法
- dropout比率最好的设置为0.5,因为随机生成的网络结构最多
- Linux 上扩展swap分区
- kdbg调试linux汇编,Ubuntu 16.04安装Kdbg替代Insight实现汇编的调试
- 放学默示录Ⅰ:来!抠奖 移动游戏策划案
- greensock包使用
- Spring07----Bean的作用域
- mysql主从错误1007_mysql主从错误:1032
- oppo9s刷机教程_oppor9s怎么自己刷机很简单的技巧
- VMware如何开机自动启动虚拟机也启动
- 计算物体自由下落的距离
- CDH 端口未授权访问:hdfs-50070, yarn-8088, jetty漏洞修复
- 福州大学计算机专业排名2018,福州大学2019年排名第64位 较2018年下降3名
- 树莓派 树莓派 编c++_为什么树莓派仍然是教育的白骑士
- jQuery移除或禁用html元素的点击事件