2020-04-18

菜鸟自己总结的一点小东西1

还是小菜鸟,正在学C语言,欢迎各位大佬指点,小弟感激不尽。![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418154254658.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NqaWFuYW4=,size_16,color_FFFFFF,t_70#pic_center)
昨天子啊写一个代码,大概要求是创建str1和str2两个字符串,然后要求将str1的字符串copy到str2中,并要求用指针方法。
下面是我的代码![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418152104213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NqaWFuYW4=,size_16,color_FFFFFF,t_70#pic_center)
然后我在思考一个问题,如果末尾解引用我不要str2,而是用*target2这个指针是否也可行呢,于是抱着这个想法我试了一下,结果显示null.
那么问题来了,为什么是这样子呢。经过昨天咨询了论坛大佬还有搜索相关的资料,我总结出了这个问题,首先是我对于while((*target2++ = *target1++)!='\0')这行程序理解有所偏颇,其次对于指针的概念还是理解得不够深入。
首先先来看while((*target2++ = *target1++)!='\0')这行程序我们把它简化成((*t2++=*t1++)!='\0')方便下面解释。
*t2++=*t1++,C语言是从右往左,++优先于*操作符,先计算t1++,++在于增加了字符的值,之后再赋予一个指针,就是*t1,再把这个赋给了*t2,**简单理解:*t2=*t1,t2+1,t1+1**
而再这个复制过程中,t2的地址是在不断改变的因为它是在这个循环里面。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418154335516.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NqaWFuYW4=,size_16,color_FFFFFF,t_70)
我们可以看到,每次进行自加复制的时候t2的地址都是改变了,t1赋完值后,t2已经的指向也跟着到了字符串的尾部,所以输出的是null.正确的做法是printf("%s",str2);
从这里我要引用一下昨天一位热心为我解答大佬的见解,如果把字符串比做梯子,那么指针就是在这梯子走的人,人是可以变得,但梯子始终在那里,当我们用*t解引用时就相当于人踩在了梯子上,当这个指针在自加复制到最后'\0'时,它的指针就指向了'\0'这个字符,所以输出来自然是null啦。
自己的第一篇博客,不奢求点赞之类,只不过是自己学习过程中当作自己的一个笔记总结,欢迎有缘路过者加以斧正点评,来自一名菜鸟的殷切希望。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值