C语言的指针类型包含两方面信息:一是地址,存放在指针变量中;二是类型信息,关乎读写的长度,没有存储在指针变量中,位于用该指针读写时的mov指令中,不同的读写长度对应的mov指令不同。
例子:
int gi; //globle variable
int *pi; //globel pointer variable
int _tmain(int argc, _TCHAR* argv[])
{
pi = &gi;
0127136E mov dword ptr ds:[01277138h],127713Ch
*pi = 12;
01271378 mov eax,dword ptr ds:[01277138h]
0127137D mov dword ptr [eax],0Ch //dword 说明了给int型指针赋值要占4字节
return 0;
01271383 xor eax,eax
}
换成short类型的变量在进行测试
short gi; //globle variable
short *pi; //globel pointer variable
int _tmain(int argc, _TCHAR* argv[])
{
pi = &gi;
0133136E mov dword ptr ds:[01337138h],133713Ch
*pi = 12;
01331378 mov eax,0Ch
0133137D mov ecx,dword ptr ds:[01337138h]
01331383 mov word ptr [ecx],ax //word说明了给short型指针赋值要2个字节
return 0;
01331386 xor eax,eax
}
指针的加/减1是加/减该指针指向类型的长度的字节数。
例如int *pi; pi加1实际地址加了4字节。
short *ps; ps加1实际地址加了2个字节。
void *p是不能进行加减的,应为在汇编语言中它只有地址信息,没有类型信息,编译器不知道该加减几个字节。