拷贝

替换空格

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

day07整理

こ雲淡風輕ζ 提交于 2019-11-30 06:21:09
day07整理 购物车 结构 goods = goods_dic[goods_choice] if goods in goods_car: goods_car[goods] += 1 else : goods_car[goods] = 1 元组内置方法 什么是元组:只可取,不可更改的列表,元组一创建就被写死了 作用 元组一创建就被写死了 定义方式 ()内用逗号隔开多个元素(可以为任意数据类型) 注意: 如果元组只有一个元素,必须得加逗号 使用方法 索引取值 索引切片 for循环 成员运算 len长度 index获取元素索引 count 计数 有序or无序 有序 字典 作用 存储多个数据,对每个数据具有描述 定义方式 {}内用逗号隔开多个键key(具有描述意义,不能为可变数据),value(任意数据类型) ==可变->不可哈希,不可变-->可哈希== 使用方法 #### 按照key取值 print(dic['b']) 添加值,没有就修改 dic['b'] = 4 for循环 成员运算 len长度 keys/values/items for snf , sfkjjs in dic.items():#解压缩 ​ print(snf,sfkjjs) get 获取 update 更新叠加字典,增加 fromkeys 从列表中获取key值,value为None setdefault

Python之深浅拷贝

坚强是说给别人听的谎言 提交于 2019-11-30 05:33:14
1.浅拷贝 shallow copy s=[1,'alex','alvin'] s2=s.copy() print(s2) s2[0]=22 print(s) print(s2) 输出结果: [1, 'alex', 'alvin'] [1, 'alex', 'alvin'] [22, 'alex', 'alvin'] 使用copy方法,复制S2。修改S2,不会影响S的值 2. s=[[1,2],'alex','alvin'] s3=s.copy() # s3=s[:]也是浅拷贝 print(s3) s3[1]='linux' print(s3) print(s) s3[0][1]=3 print(s3) print(s) 输出结果 [[1, 2], 'alex', 'alvin'] [[1, 2], 'linux', 'alvin'] [[1, 2], 'alex', 'alvin'] [[1, 3], 'linux', 'alvin'] [[1, 3], 'alex', 'alvin'] 修改S3里的元素-列表里的元素。也会影响S 赋值原理: 3. a=[1,2,3] b=a print(a) print(b) b[2]=4 print(a) print(b) 注意:通过赋值,a和b会指向同一个地址。如果修改b这块内存中的某块地址,a也会跟着变化。 深浅拷贝可用于银行亲情账号绑定

C++:Copy & Reference Count

馋奶兔 提交于 2019-11-30 03:33:10
浅拷贝、深拷贝 通常,我们会按如下方式书写拷贝构造函数: class LiF { public: LiF(int _lif = 0) : lif(_lif) {} // 默认构造函数 LiF(const LiF& l) : lif(l.lif) {} // 拷贝构造函数 private: int lif; }; 这是正确的。但是,如果数据成员包含指针类型的话,这种写法就很危险了。 class LiF { public: LiF() { lif = new int(0); } // 为lif动态分配内存 LiF(const LiF& l) : lif(l.lif) {} // 拷贝构造函数 ~LiF() { // 析构函数 delete lif; // 释放分配给lif的资源 lif = nullptr; // 置空 } private: int* lif; }; LiF l1; LiF l2(l1); // 程序结束析构l2时,程序将崩溃 在拷贝 l1 生成 l2 的时候,我们的构造函数只是简单的把 l1 的 lif 成员的值赋予了 l2 的 lif ,也就是说,它们保存的都是 l1 构造时分配的地址,当两者之中的某个对象被销毁时,构造函数正常执行,资源被释放,但之后如果另一个对象也被析构, lif 的资源就会被重复释放, lif 也就变成野指针。这种拷贝方式也称为 浅拷贝

C++深拷贝和浅拷贝

蓝咒 提交于 2019-11-30 03:09:55
所谓浅拷贝,就是说编译器提供的默认的拷贝构造函数和赋值运算符重载函数,仅仅是将对象中各个数据成员的值拷贝给另一个同一个类对象对应的数据成员。 在深拷贝情况下,对于对象中动态成员,就不能仅仅简单地赋值,而应该重新动态分配空间。 来源: https://www.cnblogs.com/judes/p/11549388.html

C++:Special Member Functions

天大地大妈咪最大 提交于 2019-11-30 02:53:48
Special Member Functions 区别于定义类的行为的普通成员函数,类内有一类特殊的成员函数,它们负责类的 构造 、 拷贝 、 移动 、 销毁 。 构造函数 构造函数控制对象的初始化过程,具体来说,就是初始化对象的数据成员。构造函数的名字与类名相同,且没有返回值。构造函数也可以有 重载 ,重载区别于参数数量或参数类型。与其他成员函数不同的是,构造函数不能被声明为 const ,对象的常量属性是在构造函数完成初始化之后获得的。 默认构造函数 默认构造函数的工作是:如果在类内定义了成员的初始值,那么用初始值初始化成员;否则,默认初始化成员。 默认初始化是指定义变量时不赋予初始值时被赋予默认值的动作。定义于函数体外的内置类型如果没有被显式初始化,则赋值0;在函数体内定义的变量不会被初始化。 class LiF { public: LiF(int _lif = 0) { lif = _lif; } // 指定了lif的初值,这是一个默认构造函数 private: int lif; } LiF l; // 调用默认构造函数,此时l.lif值为0 再看下面这种情况: class LiF1 { public: LiF1(int _lif = 0) { lif = _lif; } int lif; }; class LiF2 { public: LiF1 lif1; }; LiF2

Kafka如何保证高吞吐量

梦想与她 提交于 2019-11-30 01:43:07
1.顺序读写 kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能 顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写 生产者负责写入数据,Kafka会将消息持久化到磁盘,保证不会丢失数据,Kafka采用了俩个技术提高写入的速度。 1.顺序写入:在大学的计算机组成(划重点)里我们学过,硬盘是机械结构,需要指针寻址找到存储数据的位置,所以,如果是随机IO,磁盘会进行频繁的寻址,导致写入速度下降。Kafka使用了顺序IO提高了磁盘的写入速度,Kafka会将数据顺序插入到文件末尾,消费者端通过控制偏移量来读取消息,这样做会导致数据无法删除,时间一长,磁盘空间会满,kafka提供了2种策略来删除数据:基于时间删除和基于partition文件的大小删除。 2.Memory Mapped Files:这个和Java NIO中的内存映射基本相同,在大学的计算机原理里我们学过(划重点),mmf直接利用操作系统的Page来实现文件到物理内存的映射,完成之后对物理内存的操作会直接同步到硬盘。mmf通过内存映射的方式大大提高了IO速率,省去了用户空间到内核空间的复制。它的缺点显而易见--不可靠,当发生宕机而数据未同步到硬盘时,数据会丢失,Kafka提供了produce.type参数来控制是否主动的进行刷新

浅谈js中深浅拷贝

家住魔仙堡 提交于 2019-11-30 00:31:47
深浅拷贝只针对像 Object, Array 这样的复杂对象的。 1、浅拷贝:是对栈内存地址的复制,实际上目标对象指针和源对象指向同一片堆内存空间; 2、深拷贝:是指建一个新的对象或数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来, 是“值”而不是“引用” 我们希望在改变新的数组(对象)的时候,不改变原数组(对象)。 实现深拷贝的方法: (1)、 JSON内置的方法 var a={x:1} var b=JSON.parse(JSON.stringfiy(a)) console.log(b)//{x:1} b.x=2 console.log(b)//{x:2} console.log(a)//{x:1} 原理:该方法是用JSON.parse将对象转为字符串,然后在用JSON.stringify转回对象json字符串转换为对象的时候,会自己去构建新的内存地址存放数据。 (2)、Object的内置方法assign Object.assign:用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target),并返回合并后的target Object.assign(target, source1, source2); var a={x:1} var b=Object.assign({}, a); console.log(b); //{x:1} b.x = 2

OpenCV之图像拷贝

妖精的绣舞 提交于 2019-11-29 23:39:40
图像拷贝有两种概念: cv::Mat image; 1:浅拷贝 当图像之间进行赋值时,图像数据并未发生复制,两个对象指向同一块内存,改变图像2会影响图像1 cv::Mat img; img = image; 2:深拷贝 当图像之间进行赋值时,图像数据发生复制,两个对象指向不同的内存,改变图像2不会影响图像1 cv::Mat img; img.copyTo(image); //或者下面,二者皆可 img = image.clone(); 来源: https://blog.csdn.net/mao_hui_fei/article/details/100972649

进程与线程的区别与联系(基础篇)

喜你入骨 提交于 2019-11-29 21:55:02
如果用一句话来说明它的区别的话,那就是 线程是系统执行(调度)的最小单元,进程是系统资源分配的最小单元 。 进程和线程是怎么来的? 在传统的进程模型中,有两个独立的概念: 资源分配 与 执行 。所谓的 执行的基本单位包括运行状态、优先级、寄存器等 ,而 资源所有包括内存、程序代码、数据、文件等 。既然这是两个独立的功能,那么将它们分开岂不是更好!于是就出现上面最先说到的关于线程的概念了。在这种模式下,系统调用的基本单元就是线程了,进程只是负责管理资源,这些资源被同一进程下的线程共享。 这样分开有以下好处:1、 创建、终止、切换线程的开销要比进程小的多 ;2、 由于共享地址空间,线程通信比进程通信高效得多。下图是进程和线程分别私有的内容 。 进程的创建与终止 有以下几种情况会导致进程的创建:1、系统初始化;2、执行了正在运行的进程所调用的进程创建系统调用;3、用户请求创建一个新的进程;4、一个批处理作业的初始化。 在Linux中,我们只能通过fork系统调用来创建新的进程,它会拷贝当前进程创建一个子进程。子进程和父进程的区别仅仅在于PID(每一个进程唯一)、PPID(父进程的进程号,子进程将其设置为被拷贝进程的PID)和某些资源及统计量(例如挂起的信号,它没有必要被继承)。而exec函数负责为被拷贝文件并将其载入地址空间开始运行。在Windows中