1. 实验
1.1 源码
int a[5];
int* ptrA{&a[0]};
*ptrA = 5;
a[0] = 5;
a[1] = 5;
a[2] = 5;
1.2. 反汇编
int a[5];
int* ptrA{&a[0]};
003417D2 mov eax,4 // eax = 4
int a[5];
int* ptrA{&a[0]};
003417D7 imul ecx,eax,0 // ecx = eax * 0
003417DA lea edx,a[ecx] // edx = a[0]
003417DE mov dword ptr [ptrA],edx // [ptrA] = edx; ptr 代表指针。 "[ ]" 里的内容代表内存地址。
*ptrA = 5;
003417E1 mov eax,dword ptr [ptrA] // eax = [ptrA] = edx = a[0];
003417E4 mov dword ptr [eax],5 // [eax] = 5; 往eax的内存地址中,写入5, 即 a[0] = 5( a的起始地址偏移 0)
a[0] = 5;
003417EA mov eax,4 // eax = 4;
003417EF imul ecx,eax,0 // ecx = eax * 0
003417F2 mov dword ptr a[ecx],5 //a[0] = 5
a[1] = 5;
003417FA mov eax,4
003417FF shl eax,0 // eax << 0 --> eax = eax * 1 = 4
00341802 mov dword ptr a[eax],5 // a[4] : 从a的起始地址偏移 4 (一个int),即数组的第二个数值
a[2] = 5;
0034180A mov eax,4
0034180F shl eax,1 // eax << 1 --> eax = eax * 2 = 8
00341811 mov dword ptr a[eax],5 // a[8] : 从a的起始地址偏移 8 (两个int),即数组的第二个数值
2. 结论
数组的底层实现是利用了指针。
数组的本质是连续的内存区域。
从原理上来讲,指针和数组是同一个方法的不同表达,而数组名本身就是一个指针,数组元素只是这个指针按照一定量偏移后对应的内存区域里的内容。