什么是C中的固定地址变量

什么是C中的固定地址变量,c,pointers,memory-management,embedded,C,Pointers,Memory Management,Embedded,我在书籍和嵌入式系统相关网站上看到了许多这样的例子。。 据我所知,它用于访问存储在固定内存地址中的数据。 这是我在某本书中得到的例子 unsigned char *p=(unsigned char *)0x41E; 类型转换(unsigned char*)的用途是什么,我们可以像这样直接使用它 unsigned char *p=0x41E; 请详细解释,这里的类型转换的用途是什么,我们是将地址0x41E本身存储到指针p中,还是存储了其他内容 我完全糊涂了。 请帮助。值0x41e不是指针,因此

我在书籍和嵌入式系统相关网站上看到了许多这样的例子。。 据我所知,它用于访问存储在固定内存地址中的数据。 这是我在某本书中得到的例子

unsigned char *p=(unsigned char *)0x41E;
类型转换
(unsigned char*)
的用途是什么,我们可以像这样直接使用它

unsigned char *p=0x41E;
请详细解释,这里的类型转换的用途是什么,我们是将地址
0x41E
本身存储到指针
p
中,还是存储了其他内容

我完全糊涂了。
请帮助。

0x41e
不是指针,因此编译器可能会对此进行投诉。这就是为什么它必须作为指针类型进行类型转换

指针是普通变量,其内容(值)是指针指向的地址。编译器对它进行了特殊处理,以在取消引用指针时访问指针指向的内容

至于“固定地址变量”,许多嵌入式平台在特定的固定地址上有数据和/或寄存器。要访问这些数据或这些寄存器,通常使用初始化为这些地址的指针

类型转换的用途是什么。。(unsigned char*),在那里我们可以直接使用,就像
unsigned char*p=0x41E

0x41E
是一个十六进制数,并不意味着它属于
无符号字符*
类型。您应该通过将它强制转换为
无符号字符*
,告诉编译器它是一个地址(类型为
无符号字符*

我们是将地址“0x41E”本身存储到指针p,还是其中存储了其他内容

是的,我们将地址
0x41E
存储到指针
p
。通过执行
unsigned char*p=(unsigned char*)0x41E
,您通知编译器
p
指向内存位置
0x41E
,并且通过取消引用
p
它将获得存储在内存位置
0x41E
的内容
只需运行以下代码进行检查:

#include <stdio.h>
int main()
{
    unsigned char *p=(unsigned char *)0x41E;
    printf("%p\n",p);
}   

char
type是C语言中的一种可移植性。 因为从c99开始,每个内存区域都允许使用一个
char*
别名。 因此,如果您不知道预期的类型是什么,或者您甚至不得不使用不同的类型,那么使用
char*
类型来别名这些类型是安全的


如果你使用一些固定地址,你可能在一个较低级别的机器上工作,
char
type是最适合使用的,因为标准为
char
,它应该是1个字节。

强制转换主要是为了让编译器满意,但是,在某些体系结构中,指针地址必须转换为某些格式,而不仅仅是数字的普通位。例如,在分段体系结构中,强制转换可能涉及实际转换。然而,就最终结果而言,
(char*)0x41E
只是意味着“将数字0x41E解释为指针地址”,它的解引用会捕获该地址处的字符。

考虑到,在许多嵌入式编译器中,您有办法指定特定地址(例如IAR编译器)


希望这有帮助

事实上,这是错误的:您应该使用unsigned char*p;“p=address”@GrazianoGovernanitori:你断言什么是错误的,为什么是错误的?@Lee“强制转换主要是为了让编译器满意”:这是不正确的,将无符号字符指定为整数是错误的(*p实际上是字符…)@GrazianoGovernanitor被修改的不是目标,而是地址。这没有帮助,因为它是基于您对所讨论的代码的意图的误解。“希望这有帮助”-肯定没有!这甚至是不正确的语法。你说的话完全错了!更正:我删除了我答案的第一部分(错误,从我这边)。关于语法:它不是ansi C,但是,因为我们谈论的是嵌入式,我报告了嵌入式编译器中存在的一种可能性。在任何嵌入式系统上,都没有理由为此使用非标准语法。嵌入式编译器提供这种非标准方法的原因是,在调试器设计不当的情况下,它可以将硬件寄存器视为变量。据我所知,没有其他原因。一个更好的解决方案是使用100%标准C,然后使用一个好的调试器,而不是一个差的调试器。OP没有询问
char
类型。没有,但他要求解释,这就是我给出的。但是nvm。如果在我们眼里这足够让人失望的话。。。
0000041E  //output is not 0x41E because '0x' is used as prefix to inform the compiler that it is a hexadecimal number
const unsigned char test_var @0x41E = 'a';