由一道面试题目引发的对指针的思考
c吧
全部回复
仅看楼主
level 6
题目如下:
嵌入式系统经常具有要求程序员去访问某特定的内存位置单元的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。写代码去完成这一任务。
1、究竟什么是指针。
指针就是地址,地址是内存单元的编号,指针就是内存单元的编号
这个编号从0开始吗,到什么位置结束,指针是多少位的?
如下图所示:一个内存芯片的引脚包含了地址线和数据线,地址线的数量就是指针的位数。
这个芯片的地址线是8位的,指针就是8位。从图中大家看到了真实的指针,本质是一个整数,通常选择用十六进制表示,十六进制就是简化的二进制,不采用十进制表示。
在看一个32位的指针的表示方法,如下图所示
如果是32位地址线,则指针就是32位的,此时指针用十六进制表示,如图中的0x67a9就是一个指针的十六进制表示方法。和面试题目中要求”给地址为0x67a9的单元赋值0xaa66”这句话中0x67a9是一个指针表示,0xaa66是一个整型数据的表示。
2、c中引入指针的目的是什么。
指针是手段,数据是目的,通过指针操作数据,通过指针给它所表示的单元中存入数据或者读取其中的数据,指针是一种工具。
通过指针操纵数据时有两个前提条件:
第一:指针必须要合法,不能是野指针
第二:指针必须有明确的数据类型
所以需要将0x67a9强制转为整型指针后,才能通过它给它所指向的单元中存入数据0xaa66。
所以赋值语句如下:
*((unsigned int *) 0x67a9) = 0xaa66;
如果是嵌入式系统则0x67a9不是一个普通内存,应该是一个寄存器的地址,可能需要多次使用,所以可以给它起一个名字,如下:
#define GPNDAT *((unsigned int *) 0x67a9)
GPDDAT = 0xaa66
嵌入式中有一个关键字volatile,此时应该使用,则答案是:
#define GPNDAT *((volatile unsigned int *) 0x67a9)
GPDDAT = 0xaa66
2025年10月09日 09点10分 1
1