• 替换空格


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

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

     

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

     

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

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

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

     这是应该怎么解释它呢?

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

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

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

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

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

    over

    修改后:

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

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

  • 相关阅读:
    redis配置文件redis.conf总结
    react井字棋小游戏实现及优化
    springboot 如何在请求进入controller之前改变body中的值
    记录一个Springboot启动的问题->sprinboot正常启动但是tomcat却没有启动
    websocket-基于springboot的简单实现
    JVM-垃圾回收
    gRPC-Java实践
    Protocol Buffers—-java
    串口通信学习-基础
    Modbus通信协议学习
  • 原文地址:https://www.cnblogs.com/jiguang321/p/11568836.html
Copyright © 2020-2023  润新知