A: 设置一个适当类型的指针为一个正确的数字(使用一个显式类型转换以确定你意欲进行这个不可移植的转换):
unsigned int *magicloc = (unsigned int *)0x12345678;
然后,*magicloc表示你你需要的位置。如果这个位置是一个内存映射I/O寄存器,你可能也需要使用volatile限定符:“volatile unsigned int *magicloc”。(如果你想不按字引用某个地址,使用unsigned char * 。)
在MS-DOS下,你会发现一个像MK_FP这样的宏,用于处理段和偏移。像Gary Blaine建议的那样,你也能声明一个巧妙的数组,它允许你使用数组表示来访问屏幕内存。例如,在一个80x25文本模式的MS-DOS机器上,这个声明
unsigned short (far * videomem)[80] = (unsigned short (far *)[80])0xb8000000;
你能访问位于行i,列j上的字符和特征字节,使用videomem[i][j]。
许多操作系统在一个不能直接访问I/O设备(或进程外的任意地址)的保护模式,执行用户模式程序。在这种情形,你将需要请求操作系统为你完成I/O操作。
同时参见问答4.14和5.19。
参考:K&R1 Sec. A14.4 p. 210
K&R2 Sec. A6.6 p. 199
ISO Sec. 6.3.4
Rationale Sec. 3.3.4
H&S Sec. 6.2.7 pp. 171-2
(This Chinese translation isn't confirmed by the author, and it isn't for profits.)
Translator : jhlicc@gmai1.c0m
Origin : http://www.c-faq.com/osdep/rawmemadr.html