- 论坛徽章:
- 0
|
回复 219# KBTiller
举例 x86 32位系统 vc6.0
#include <stdio.h>
int i;
int *p;
int main(int argc,char *argv[])
{
printf("&i=0x%p\n",&i);
printf("&p=0x%p\n",&p);
i = 0x12345678;
p = (int *)0x12345678;
return 0;
}
打印结果:
&i=0x004235BC
&p=0x004235C0
int i;编译器把从0x004235BC开始的四个字节分配给了i,你对0x004235BC开始的四个字节可读可写,说白了就是可以放0101010,0到0xffffffff随便哪个都可以仍到那四个字节里去,绝对合法!
int *p编译器把从0x004235C0开始的四个字节分配给了p,你对0x004235C0开始的四个字节可读可写,0到0xffffffff随便哪个都可以仍到那四个字节里去,绝对合法!
这有什么不可以理解的。
*p间接访问,说白了,就是编译器规定了*这个操作符用间接寻址来操。
*p可能非法访问。
int a[2],a[10000]=20;当然,你可以说不一样的非法访问,但是站在一定高度,都是一样的。
i = 0x12345678; 就是把0x004235BC 开始的四个字节分别赋值:0x78 0x56 0x34 0x12.
你说的"事实上我们根本无法对地址进行任何操作",我不知道你到底想表达什么。
i=0x12345678,只是方便我们写程序。编译器或者说操作系统才不关心i什么玩意,关心的只是从哪个地址开始多少个字节里存放什么玩意。 |
|