107 指针和数组

本文详细解释了数组在内存中的连续存储方式,通过示例展示了如何使用指针进行数组元素的访问和修改,以及数组名与指针的关系。重点强调了多维数组其实是一维数组的内存布局原理。
摘要由CSDN通过智能技术生成

数组在内存中是连续的。

	int* prt{ &a[0] };
00007FF69E68186D  mov         eax,4 		 	// 将4存储到寄存器eax中
00007FF69E681872  imul        rax,rax,0  		//将rax乘以0,结果仍然是0
00007FF69E681876  lea         rax,a[rax]  		// 使用LEA(Load Effective Address)指令,计算数组a的地址,相当于取a[0]的地址,并将结果存储到寄存器rax中。
00007FF69E68187B  mov         qword ptr [prt],rax  //将rax中的地址值存储到prt指针指向的位置。

	*prt = 5;
00007FF69E68187F  mov         rax,qword ptr [prt]  	// 获取指针 prt 中存储的地址
00007FF69E681883  mov         dword ptr [rax],5  	// 在该地址的位置存储值5,即相当于将 *prt 赋值为5
	a[1] = 6;
00007FF69E681889  mov         eax,4  			// 将4存储到eax中
00007FF69E68188E  imul        rax,rax,1  		// 将rax设置为偏移量
00007FF69E681892  mov         dword ptr a[rax],6  	// 在数组a的第二个元素即偏移量为4的位置赋值为6
	a[2] = 7;
00007FF69E68189A  mov         eax,4  		// 将4存储在eax中
00007FF69E68189F  imul        rax,rax,2  	// 将rax设置为偏移量
00007FF69E6818A3  mov         dword ptr a[rax],7  	// 将数组在第三个元素的值(即偏移量迷8)设置为7
	a[3] = 8;
00007FF69E6818AB  mov         eax,4  
00007FF69E6818B0  imul        rax,rax,3  
00007FF69E6818B4  mov         dword ptr a[rax],8  
	a[4] = 9;
00007FF69E6818BC  mov         eax,4  
00007FF69E6818C1  imul        rax,rax,4  
00007FF69E6818C5  mov         dword ptr a[rax],9  

数组对内容的控制就是初始指针加上偏移量。
对于编译器而言,指向数组的指针,数组名就相当于指向0索引的地址。

对于数组而言,以下内容输出一致

int a[5];
int *prt{&a[0]};
std::cout<<a[1]<<std::endl;
std::cout<<ptr[1]<<std::endl;

数组名实质上是一个指针。

多维数组在内存中实际还是按照一维数组存储的。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值