思路:我的想法是先找到原句子中有多少空格,然后再new一个新长度的数组,将str中所有的内容拷贝到新数组中去。
最后将令str指向新数组temp的首地址。
what?不对?难道指针的指向有问题?我跟进去调试发现并没有什么问题,后来我想到了,应该是传参的关系!
还没赋值的时候,两者的地址如下:
执行完这句赋值语句之后,我们发现在函数内部确实实现了我们想要实现的效果:
然而,跳出函数之后,观察到的结果却是这样的:
这是应该怎么解释它呢?
首先我们得理解传指针它到底传的是什么!
如图,我模拟了一张编译器内部的符号表,我们得先明白什么是指针变量,就是它的类型为指针类型,存储的值是实际指向的内存的地址。即指针变量存储的是地址,而普通的变量存储的是常量,需要使用&取地址符来获得地址。
所以现在可以分析上述错误的原因了,由于传的是地址,str 形参接收的是一个指针变量的值,而且数组是申请连续的内存空间,所以我们可以通过索引或者++,--操作使指针进行偏移,然后通过 *ptr 给内存赋值,这时我们就改变了内存中的值,实现了指针的作用。
然而我的代码写道 str = temp 只是将指针变量 temp 中的地址赋值给形参 str 并没有改变实参中的值,即没有改变指针指向的内存中的值。
也就是说传指针是一种特殊的传值,只不过我们可以通过这种形参得到的值来取到实际地址中的值。我们改变str只是改变了形参,并没有改变实参。
over
修改后:
只是改动了一处,将新数组中的值拷贝到str所指向的内存位置中,进行深拷贝(拷贝内存值)而不是浅拷贝(拷贝指针值)。
针对于本题,我还想指出的不足是,函数的形参是一个指针和一个数组长度length,容易让我们认为str所指向的数组的大小是固定的,然而将新的数组temp赋值给str确是可以运行通过的,就说明了它传进去的实参是 char str[100] = "123456", 还有很多空闲的空间可以备用。