c语言指针相减(c语言指针,下面这题看不懂,求解:loudly_crying_face:)

本文目录
c语言指针,下面这题看不懂,求解:loudly_crying_face:
while (*y++)
因为++运算符优先级比*高,所以先对指针y加1,再取出指针y指向的 字符
如果取出的字符不为0(\0) 就循环
因为字符串数组 a={hello} 是依字符’\0’结尾,字符’\0’的ASCII 码值 是0
这样当指针y 指向’\0’时 就结束循环。
return (y-x-1)
y x 都是指针,是内存地址,y-x-1 就两个指针相减再减1 ,返回运算结果。
从实际执行结果看 返回的是5
这样y-x=6
其实实际循环了5次,但是y 和 x 两个指针却相差6
是因为++的优先级比*高导致的。
希望我的回答对你有点帮助,很高兴和你一起讨论和学习C语言。
C语言的指针是比较难理解的知识点,需要多练习才能掌握。
c语言中指针变量可以相加吗其含义是什么
指针变量是有加减运算的,但是要注意以下几点:
1.指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x20000000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址。指针变量可以加减,但是只能与整型数据加减,此时加减的含义并不是其地址值进行了加减,也就是说如果指针变量p的值是0x20000000,那么p=p+2;的值并不是0x20000002,并不是地址值的简单相加,那么地址值加减多少是与指针指向的数据类型相关联的,如果在32位的操作系统上,p是指向整型数据的指针变量,那么p=p+2之后,p的地址值变成0x20000008,也就说实际上地址值加了多少呢:sizeof(int)*2这么多。说明白点,我们加减的数字是以指针指向的数据类型为量度的,P+2表示p在内存中前移两个int的距离,如果p不是int类型,而是其他类型道理也是一样。同样指针与整型数据相减也是同样的道理。
2.指针之间可以相减,但不可以相加:两个同一类型的指针变量是可以相减的,他们的意义表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数),例如对于int类型的指针p和p1. p1-p的意义表示他们之间相隔多少个int类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。 指针变量的自加和自减实际上是与整数1的加减运算。
3.指针之间可以比较大小。但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。
C语言指针可以相减吗为什么
如果两个指针向同一个数组,它们就可以相减,其为结果为两个指针之间的元素数目。仍以本章开头介绍的街道地址的比喻为例,假设我住在第五大街118号,我的邻居住在第五大街124号,每家之间的地址间距是2(在我这一侧用连续的偶数作为街道地址),那么我的邻居家就是我家往前第(124-118)/2(或3)家(我和我的邻居家之间相隔两家,即120号和122号)。指针之间的减法运算和上述方法是相同的。
C 语言指针怎么理解?
你可以把它想象成一条无限长的纸带。纸带上边有一个个的小格子,每个小格子正好是一字节,里边能够存放一个数字。计算机的工作就是对这些小格子里的数字做处理。虽然你在电脑上能够看视频、听音乐,但这些东西本质上都是存在内存这条纸带上的数字。
两个指针相减
指针相减=(地址1-地址2)/sizeof(类型) 这个你把他当成定律 ,你要记牢。
指针相减得出的结果就是两个元素相差的单元, 地址1 和地址2 以%d求出结果,不要用十六进制,要用十进制。
在同一个数组中,相邻元素相差1个单元,这一个单元不一定是一个字节,具体多少字节,看你当初是怎么分配的。你若是int型的,当初就是每4个字节一个单元, 咱们一般数组就int类型用的多。
如图所示,我的例子中 两个地址相减是16, 除以4 , 就是4了
c语言中指针加减问题,求解答
这不是与p+3-p=12矛盾,而是,这个等式本来就不成立好不。学指针的时候会有点糊涂,这个很正常。
你把两个东西混淆了:数组的下标和实际的地址。
float类型的指针,在地址上来说的确是按4字节为单位移动的,但是在数组里面还是一格一格一栋栋饿啊,这个一格的单位是4字节。
p+3-p,你等式左边的算法是在数组里的单位,既一格一格移动;
=12,你右边的是按照地址的实际大小得出的。
两边表示的不是一种单位啊。。。
还有就是这种理论上的东西你越想越糊涂,实际去写一个测试程序,把指针指向的地址打出来看看 不久知道了?

更多文章:
java中swithcase(Java中为什么我写switch语句,在case后加break就错误,不加就正确,很困惑,)
2026年5月14日 02:30
oracle vm virtualbox 的配置(oracle vm virtualbox 中如何设置外设SD卡)
2025年12月22日 12:00
停止沸腾的水浇上冷水后会沸腾原理(烧瓶中停止沸腾的水,浇上冷水后会重新沸腾,说明)
2025年5月29日 20:15
javabus怎么上不去了(为什么JAV连续几天都登不上去)
2026年3月30日 04:30
威斯布鲁克生涯数据统计(威斯布鲁克离开湖人到快船场均多少分威少离开湖人到快船场均得分夕夕少)
2025年6月7日 15:00
存储过程的理解(oracle中的存储过程有什么作用,该怎么理解(数据更新的话用update语句不就完了吗))
2025年8月12日 19:30
linux重启网卡(请问linux配置网卡后,单独关掉网卡和重启网卡的命令是什么)
2026年5月13日 20:45
field是姓氏吗(求F开头的英文姓氏 有适合女生的姓氏吗(我知道姓氏不分男女))
2025年11月10日 11:15
美国参议院通过史上最大气候法案(拜登的“重大胜利”美国史上最大的气候投资法案通过意味着什么)
2026年5月7日 21:15
c语言messagebox用法(VC++中messagebox的用法)
2026年5月7日 04:30
inspect是什么意思(inspect 和 test 的区别)
2026年6月3日 07:30
西安建站公司模板(企业官方网站用什么样的模板建站合适(下))
2026年2月28日 20:15











