鱼C论坛

 找回密码
 立即注册
查看: 2082|回复: 10

[已解决]指针运算符和自增运算符

[复制链接]
发表于 2020-2-18 22:57:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        char str[MAX];
        char *target = str;
        printf("请输入一个字符串:");
        fgets(str, MAX, stdin);
        while (*target++ != '\0')
        {
                length++;    //但由于这是一个后缀的自增运算符,所以自增的效果要在下一条语句才会生效,因此这里取出来的依然是 target 地址自增前指向的数组元素的值。(小甲鱼笔记)
        }
        printf("您总共输入了 %d 个字符!\n", length - 1);

请问两个问题:
        1. 上面“小甲鱼笔记”那句话怎么理解呢? *target++!='\0'   是从*target(也就是str[0])开始还是*target++(也就是str[1])开始呢?要是第二种情况的话,那么str[0]不就没有记录到吗?
        2. 为什么最后算长度要length-1呢?
最佳答案
2020-2-19 01:56:43
LXMARCO 发表于 2020-2-19 01:37
还有,不是我玻璃心,自尊心强,如果不是很想回答或者觉得我很弱智,放心里就行,不必留言无关知识其他内 ...

嗯嗯,赞同,大家应该平心静气来交流学习上的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-19 00:34:11 | 显示全部楼层
ba21 发表于 2020-2-18 23:26
*target(也就是str[0])开始
长度要length-1呢 鬼知道你length初始化是几

length初始化是0.      
首先谢谢你的回答
其次你的语气很高傲让人很不舒服,如果你觉得很简单或者是不想回答可以不用回答。
谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 01:30:17 | 显示全部楼层
刚刚自己在网上又查阅了一番资料,大概明白了,也欢迎其他人指正

小甲鱼这里是获取的字符串长度是用while 循环用指针指向数组元素来判断,目的也是为了实现strlen。
下面方法也是实现strlen:
length = sizeof(str)-1;//包含空格, 但 减1 这个原理和我上面的问题好像是一样的
之所结果要减1,是因为字符串结束符'\0‘在数组中占用了一个字节。(其实两种情况好像和length是否为多少没关系??)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 01:37:03 | 显示全部楼层
ba21 发表于 2020-2-18 23:26
*target(也就是str[0])开始
长度要length-1呢 鬼知道你length初始化是几

还有,不是我玻璃心,自尊心强,如果不是很想回答或者觉得我很弱智,放心里就行,不必留言无关知识其他内容。
我是广大初学者中的一员。
就是因为抱着学好的热情才会 认真做题和查阅资料并且询问鱼吧各位朋友。
当然我们的难题在您们那儿很弱智,但对于我们了解知识的道路却很重要。
不管您是出于工作责任,或者攒分数鱼币其他情况,给他人造成不悦都是没有必要的。
希望鱼C越来越好。我很喜欢这个学习知识相互交流的平台。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-19 01:56:43 | 显示全部楼层    本楼为最佳答案   
LXMARCO 发表于 2020-2-19 01:37
还有,不是我玻璃心,自尊心强,如果不是很想回答或者觉得我很弱智,放心里就行,不必留言无关知识其他内 ...

嗯嗯,赞同,大家应该平心静气来交流学习上的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-19 09:52:50 | 显示全部楼层
LXMARCO 发表于 2020-2-19 01:37
还有,不是我玻璃心,自尊心强,如果不是很想回答或者觉得我很弱智,放心里就行,不必留言无关知识其他内 ...

加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-19 14:20:43 | 显示全部楼层
你的自尊心这么强还到这问什么问题。
代码不上全,好心答你,还闲别人语气差。你以为你是交了几十百把万的学生,老师都要哄到你,你就开心了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-2-19 14:43:25 | 显示全部楼层
把target++看成一个表达式,其含义是先以target作为该表达式的值,再自增
*target++也就是先运算*target后再target+1  因此这个target+1在下一次循环中才成为*(target+1)
我这样解释对吗?

另外我也是初学者,不觉得这个问题很智障,这里是大家学习交流的地方,秀优越感去某乎可好?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-19 18:28:26 | 显示全部楼层
ba21 发表于 2020-2-19 14:20
你的自尊心这么强还到这问什么问题。
代码不上全,好心答你,还闲别人语气差。你以为你是交了几十百把万的 ...

1. 首先你是不是一位“老师”,有待考证。
2. 我没有要求任何 “哄” , 我只要需要有人能回答我的问题,我语气也很诚恳“,我说的是“请,谢谢”。 我不要求语气很好,但觉不会接受无端的无礼,你不开心你可以完全选择不回答我的问题。 而不是把你的情绪宣泄在我这里。
3. 你提到钱。 现实中宣传自己补课机构的都要试听课,我愿意交钱也是冲着小甲鱼的态度和精神。 我没有对鱼C有任何看法,我从头到尾都是对您的态度有保留意见。我对事不对人,不好的我就指出来。
4. 您是否应该态度中等(我不要求您有好),至少语气不要那么高傲,这一点您应该询问您的老板。 鱼C这么多流量平台,您头像放着可能是您私人工作室广告,这也能达到您的其余宣传目的,既然您有得到就需要有付出,您下面写着版主,那就是为我们解答疑惑,至于这个过程有什么要求,我想”解答疑惑,实习版主“这个身份应该是有一定的职业要求的吧?
5. 您也是还是钱的问题。很多都是开源,我也不要求您像Linus他们那样,网课那么多,coursera,udacity之类的免费网课如此之多,您如果觉得您的才识和您 ”尊敬的语言“ 是为RMB服务,大可自行开个网站教学收费询问。您不喜欢我们这种小白,可以选择不回答。
6. 因为您回复我的问题,我作为 ”顾客“ 我当然有权利对您的 ”服务“ 进行评价和打分。即使我是一个学生,都有权利期末对老师教学测评。不好的地发我只是提出建设性意见,希望不要因为您一次可能不是因为主观的失误影响到您的团队,我也是希望大家更好,您的顾客多了流量多了是不是才有希望 ”变现“呢?
7. 您的再一次回复我只是感觉到了更大的傲慢,”自尊心这么强问什么还来问什么问题?“  ,您的意思是只要是问问题的人,您就有权利以任何差语气回答,而且对方必须接受,如果不接受就去别的地发对吗?
8. ”你以为你是交了几十百把万的学生,老师都要哄到你,你就开心了。“  , 我的开心完全不去绝于 ”哄“, 而是能正常解答一个我的疑惑。 若您的回答是 ”你的length没说初始值“ 有何不好呢?简单高效。   您选择”鬼知道你的XXXX“还特意标成红色,是想表达什么呢?  
9. 谢谢,我没有任何侮辱您人格的意思,我只是针对这次回答问题作出我真实感受和反馈,当然您可以选择接受或者不接受。我的出发点,说出我的感受是想小甲鱼的鱼C会越来越好,因为今天不好的感受会发生在我身上,明天可能就在别人身上。
10. 感谢鱼C这个平台提供的教学和学习机会,希望越来越好。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
zltzlt + 3 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-19 18:34:19 | 显示全部楼层
Zhighway 发表于 2020-2-19 14:43
把target++看成一个表达式,其含义是先以target作为该表达式的值,再自增
*target++也就是先运算*target后 ...

其实我不是很明白是因为  *target++ 中++ 运算符优先*运算符,但是运行的时候是从*target开始的,不是从++。
刚刚看了你的回答和程序的实际运行,你说的是对的。  谢谢你!
  
我分享一下我之前找到的一些小知识(能解决我这个问题):
第一组:*p++,它的运算顺序是先返回 *p的值,然后p再++。
第二组:(*p)++,他的运算顺序是先返回 *p的值,然后 *p的值再++,这一点从运算后的数组a的值可以看出来。
第三组:*(p++),运算顺序是先返回 *p的值,然后p再++,也就是说它和 *p++的运算顺序一样。

这三组都是先返回 *p的值,区别就在于到底是p++还是 *p的值++。

第四组:++*p,先将 *p的值++,然后再返回 *p的值。
第五组:++(*p),先将 *p的值++,然后再返回 *p的值,所以它和++ *p是一样的。
第六组: * (++p),先将p的值++,然后再返回 * p的值,和 *++p是等价的。

这三组的特点是最后都是返回 *p的值,不同点在于是 *p先++还是p++。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 18:11:24 From FishC Mobile | 显示全部楼层
LXMARCO 发表于 2020-2-19 18:34
其实我不是很明白是因为  *target++ 中++ 运算符优先*运算符,但是运行的时候是从*target开始的,不是从+ ...

棒噢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 04:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表