浅拷贝和深拷贝

该文章转载于:https://blog.csdn.net/jiang7701037/article/details/98738487?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162623663616780261920193%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162623663616780261920193&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-98738487.first_rank_v2_pc_rank_v29&utm_term=%E6%B5%85%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B7%B1%E6%8B%B7%E8%B4%9D&spm=1018.2226.3001.4187
**一.先了解基本类型和引用类型的区别
**一.了解内存
内存是储存数据的,不同数据要放到不同的区域中。
内存分为四个区域:
栈区    只可以存放局部变量的值     被调用函数的地址      形参
堆区 new出来得值
全局静态区 存放全局变量        静态变量
只读区    常量区存放常量 ,代码区存放程序的代码
**二.基本类型和引用类型在内存上存储的区别
以栈区和堆区举例说明:

在这里插入图片描述
1.局部变量age被定义并被赋值后,会取值存到栈区中,并将值起名为age,又由于给age赋了一个值,这个值是基本类型,所以值会直接存储在栈内;
2.定义局部变量arr,会在栈区申请内存空间把局部变量的值存进去,但是arr中的值不是基本类型而是引用类型(new出来的)。因此会在堆内存中存入arr的数据:【12,23,34】,再把堆的地址赋给arr(栈内)
**基本类型和引用类型的概念
1.基本类型:就是值类型,定义的变量所对应的内存区域存储的是值。例如:age变量所对应的内存存储的就是值250
2.引用类型:就是一个地址类型。 变量arr就是一个引用类型。arr所对应的内存中储存着地址,而真正的数据是在地址对应的内存区域中。
**三.基本类型和引用类型在赋值时的内存变化
**1、基本类型:
赋值就是拷贝

**2、引用类型:
在这里插入图片描述
举例说明:
在这里插入图片描述

如果给arr【0】进行赋值的话,也就是改变原来的值得话,arr1【0】的值也会被改变。因为arr和arr1保存着相同的地址,两个人引用的地址是共享的。
**四.深拷贝和浅拷贝

拷贝,实际意义上是赋值。把一个变量的值赋给另一个变量,就是把内容进行了拷贝。把一个对象的值赋给及另一个对象,这就叫拷贝。
**1、基本类:

Var a = 100;
Var b = a;
consle.log b;//100
如果要改变b的值得话,a的值不会被改变;
**2、引用类型:

引用类型赋值时,赋的值地址(就是引用类型变量在内存中保存的内容)
例如:
var arr1 = new Array(12,23,34);
var arr = arr1;         这就是一个最简单的的浅拷贝
如果arr的值改变,arr1的值也会改变的
这是因为两个变量用了相同的地址
    这只是把arr1的地址拷贝了一份,给了arr,并没有把数据给arr。。
**3、用json对象的方式演示浅拷贝和深拷贝:

1.定义一个json对象(对象的属性也是对象)

var p = {
	id:"007",
	name:"刘德华",
	age:"18"
	book:"new array("三国演义","红楼梦",“水浒传”)  //引用类型
}



在这里插入图片描述

2.进行浅拷贝

var p1 = {};
for(let key in p){
	p1[key] = p[key];
}
p1.book[0] = "四国";
console.log(p1);
console.log(p);

p和p1book[0]的值都变成了四国。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
3.进行深拷贝

var p2 = {};
for (let key in p){
	p2[key] = [];
	for(let i in p[key]){
		p2[key][i] = p[key][i]
	}else{
	p2[key] = p[key];
	}
}
p2.book[0] = "四国";
console.log(p);
console.log(p2);

只有p2.book[0]的值变成了四国;
在这里插入图片描述

在这里插入图片描述
4.深拷贝最终版

var p = {
	id:"007",
	name:"刘德华",
	wife:{
		id:"008",
		name:"刘德的妻子",
		address:{
			city:"北京",
			area:"海淀"
	}
	}
}
function copyObj(obj){
	let newObj = {};
	for(let key in obj){
		if(typeof obj[key] = "object"){
			newObj[key] = copyObj[obj(key)]	
		}else{
			newObj[key] = obj(key);
		}
	}
	return newObj;
}
ley p2 = copyObj(p);
p2.wife.name = "张三疯";
p2.wife.address.city = "香港"
console.log(p);
console.log(p2);

在这里插入图片描述
深拷贝_如果属性是数组等非键值的对象

//给数组对象增加一个方法,用来复制自己
Array.prototype.copyself = function(){
	let arr = new Array();
	for(let i in this){
		arr[i] = this[i];
	}
	return arr;
}
var p (){
	id:"oo7",
	name:"刘德华",
	books: new Array("三国演义","红楼梦","水浒传")
}
function copyObj(obj){
	let newObj = {};
	for(let key in obj ){
		if(typeof newObj[key] == 'object'){
			newObj[key] = obj[key].copyself();
		}else{
			newObj[key] = obj[key];
		}		
	}
	return newObj
}
var p1 = copyObj(p);
p1.books[0] = "四国";
console.log(p);
console.log(p1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值