访问数组的方法有两种:通过下标访问和通过指针访问
指针寻址的方式不但没有下标寻址方式遍历,而且效率也比下标寻址寻址低。
a.由于指针是存放地址数据的变量类型,因此在数据访问的过程中需要先取出指针变量中的数据,然后再针对此数据进行地址偏移计算,从而寻址到目标数据。
b.但数组名本身就是常量地址,可直接针对数组名所替代的地址值进行偏移计算。
char * pchar=NULL;
char szbuff[]="Hello";
mov eax,[String "Hello"(00420030)];
mov dword ptr[ebp-0Ch],eax;
mov cx,word ptr[string "Hello"+4(00420034)];
mov word ptr [ebp-8],cx;
pchar=szbuff;
lea edx ,[ebp-0Ch];
mov dword ptr [ebp-4],edx;
解释一下:
也就是ebp-4 这个地址单元 里面 存放着 ebp-0Ch 这个地址值(并非地址的值,而是地址值)
printf("%c",*pchar)
mov eax,dword ptr[ebp-4];
movsx ecx,byte ptr [eax];
…………
printf("%c",szbuff[0]);
movsx edx;byte ptr [ebp-0Ch];
…………
从上两种访问方式的实现代码来看,指针寻址方式要经过2次寻址才能得到目标数据,而下标寻址方式只需要1次寻址就可以得到目标数据。因此指针寻址比下表寻址多一次寻址操作,效率自然要低。
虽然使用指针寻址方式需要经过2次间接访问,效率要比下标寻址方式低,但其灵活性更强,可修改指针中保存的地址数据,访问其他内存中的数据,而数组下标在没有越界使用的情况下只能访问数组内的数据。