引用: 我知道在标准c语言里面是不能给指定的一个地址单元赋值的,但是不知道单片机这里能不能这样。
你所谓的 标准C语言,我想,很大程度上你理解的是基于PC操作系统,也就是windows,linux这类的,你的结论是对的,但坦白说我也不知道为什么,我想也许理由是,这类操作系统因为有MMU的存在,因此并不直接操作物理地址。
单片机里能不能这样?
能。
在51里,其实有一个特别的操作语法,__at__(地址)可以完美解决。
但是,在更加“正经”的单片机,比如STM32里,是没有这个东西的——事实上,除了51这个异类,都不太可能有。
那么,怎么办呢?
*(char *)0x8356 = 0x23;
引用: 问题1:keil c51中怎么才能使用DPTR寄存器?用keil时包含后我可以使用DPH和DPL但是不能使用DPTR,难道单片机的c里面不能用DPTR?
我忘了这是个什么寄存器,但看起来反正就是个16位寄存器呗。
其实单片机的C里——确切的说,是不同版本的C编译器和C标准库。
并没有所谓的不能直接操作寄存器的说法。
关键是,有没有开放。
基于上一个问题相同的理由,我不了解WINDOWS LINUX下的C这方面的规定。
但是,在单片机里是可以的。
而其实不管对于51还是对于STM32,最终对于所谓寄存器的操作都等同于 对直接地址的操作,如此而已。
PS一句,在C里,没有什么是可不可以,推荐不推荐的,C很灵活很底层,只是,你要知道自己在做什么。
当然,这些不推荐,也是有道理的,通常是为了获得更好地通用性和降低对硬件的依赖和复杂度。
但如果你知道自己在做什么,没什么不可以的。
就像,如果有人突然问我,倚天剑可不可以叉一只野鸡来烤,你猜我会怎么说?
引用: 问题2:单片机的c中指针是多少位的?在标准c里任何类型的指针都是4个字节,即32位(虽然这和操作系统还有编译器有关但一般来说都是32位),但是51单片机好像片内与片外的地址不是一样长的啊(片内8位,片外16位),那么用c给它编程时,其中的指针是多长呢?
还是那句话,你所谓的标准C,看来可以进一步指定为 32位X86机器。
其实,指针的宽度,在我看来,可以粗糙的认为,取决于 机器的机器字长。
有点类似于int的字长。对于8位机51,指针和int都是2字节,对于STM32等通用32位机,那就是4字节。
在单片机里我没见过64位机,所以未曾见过8字节的。
引用: 问题3:如果我要给一个外部单元,比如0x853f,向这个单元里面写入数据。该怎么办?在标准c里面是不容许直接给一个地址赋值的,但是我在keil里面直接赋值还是能够编译通过,这是否能说这在单片机的编程里面是可以的?
还是那个解释。
重点在于你的C编译器允不允许你直接操作地址,允许操作什么范围的地址。
在你的标准C里,只有heap上分配的内存允许你直接操作地址,其他都不允许。
而单片机里,我不知道原因,但似乎它都开放了。