数组在内存中是连续的。
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;
数组名实质上是一个指针。
多维数组在内存中实际还是按照一维数组存储的。