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

时间:2013-10-07 12:12:07

标签: c pointers memory-management embedded

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

unsigned char *p=(unsigned char *)0x41E;

类型广告(unsigned char *)的用途是什么,我们可以直接使用

unsigned char *p=0x41E;

请详细解释一下,那里使用类型转换有什么用,我们是否将地址0x41E本身存储到指针p或其他内容存储在那里?

我完全糊涂了。 请帮忙。

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

0x41e不是指针,因此编译器会抱怨它。这就是为什么它必须被类型化为指针类型。

指针是普通变量,其内容(值)是指针指向的地址。它由编译器专门处理,以访问指针取消引用指针时指向的内容。

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

答案 2 :(得分:4)

  

类型转换的用法是什么..(unsigned char *),我们可以直接使用unsigned char *p=0x41E

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

  

我们将地址“0x41E”本身存储到指针p中,或者存储其他内容。

是的,我们将地址0x41E存储到指针p。通过执行unsigned char *p = (unsigned char *)0x41E,您通知编译器p指向内存位置0x41E,并通过解除引用p它将获取存储在内存位置{{1}的内容}}。
只需运行此代码即可查看:

0x41E

输出:

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

答案 3 :(得分:0)

char类型是C中的一种可移植性。 由于c99,允许每个存储区域被char *置别。 因此,如果您不知道预期的类型,或者您甚至不得不使用不同类型,那么如果您使用char *类型来对类型进行别名,那么您就安全了。

如果您使用某些固定地址,您可能正在使用char类型最适合处理的较低级别计算机,因为char标准规定它应为1字节。< / p>

答案 4 :(得分:0)

请注意,在嵌入式世界的许多编译器中,您可以使用指定特定地址的方法(例如,IAR编译器)

const unsigned char test_var @0x41E = 'a';

希望这有帮助