首页 > 其他 > 详细

替换空格

时间:2019-09-22 21:43:00      阅读:86      评论:0      收藏:0      [点我收藏+]

技术分享图片

思路:我的想法是先找到原句子中有多少空格,然后再new一个新长度的数组,将str中所有的内容拷贝到新数组中去。

最后将令str指向新数组temp的首地址。 

技术分享图片

 

 

 技术分享图片

 

what?不对?难道指针的指向有问题?我跟进去调试发现并没有什么问题,后来我想到了,应该是传参的关系!

技术分享图片

 

 技术分享图片

 

 还没赋值的时候,两者的地址如下:

技术分享图片

 

 执行完这句赋值语句之后,我们发现在函数内部确实实现了我们想要实现的效果:

技术分享图片

 

 然而,跳出函数之后,观察到的结果却是这样的:

技术分享图片

 

 这是应该怎么解释它呢?

首先我们得理解传指针它到底传的是什么!

技术分享图片

 

 如图,我模拟了一张编译器内部的符号表,我们得先明白什么是指针变量,就是它的类型为指针类型,存储的值是实际指向的内存的地址。即指针变量存储的是地址,而普通的变量存储的是常量,需要使用&取地址符来获得地址。

所以现在可以分析上述错误的原因了,由于传的是地址,str 形参接收的是一个指针变量的值,而且数组是申请连续的内存空间,所以我们可以通过索引或者++,--操作使指针进行偏移,然后通过 *ptr 给内存赋值,这时我们就改变了内存中的值,实现了指针的作用。

然而我的代码写道 str = temp 只是将指针变量 temp 中的地址赋值给形参 str 并没有改变实参中的值,即没有改变指针指向的内存中的值。

也就是说传指针是一种特殊的传值,只不过我们可以通过这种形参得到的值来取到实际地址中的值。我们改变str只是改变了形参,并没有改变实参。

over

修改后:

技术分享图片

 

 

技术分享图片

 

 只是改动了一处,将新数组中的值拷贝到str所指向的内存位置中,进行深拷贝(拷贝内存值)而不是浅拷贝(拷贝指针值)。

针对于本题,我还想指出的不足是,函数的形参是一个指针和一个数组长度length,容易让我们认为str所指向的数组的大小是固定的,然而将新的数组temp赋值给str确是可以运行通过的,就说明了它传进去的实参是 char str[100] = "123456", 还有很多空闲的空间可以备用。

 

替换空格

原文:https://www.cnblogs.com/jiguang321/p/11568836.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!