107 指针和数组

数组在内存中是连续的。

	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;

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

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

你可能感兴趣的:(c++)