【问题标题】:what is Fixed address variable in C什么是C中的固定地址变量
【发布时间】:2013-10-07 12:12:06
【问题描述】:

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

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

类型转换(unsigned char *)有什么用,我们可以直接使用

unsigned char *p=0x41E;

请详细解释一下,那里的类型转换有什么用,我们是将地址0x41E本身存储到指针p还是存储其他东西?

我完全糊涂了。 请帮忙。

【问题讨论】:

    标签: c pointers memory-management embedded


    【解决方案1】:

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

    【讨论】:

    • 其实是错的:你应该做 unsigned char *p; "p = 地址"
    • @grazianogovernatori:你认为什么是错的,为什么错了?
    • @Lee “强制转换主要是为了让编译器开心”:这是不正确的,将 unsigned char 赋值为整数是错误的(*p 实际上是一个 char...)
    • @grazianogovernator 修改的不是目的地,而是地址。
    【解决方案2】:

    0x41e 不是指针,所以编译器会抱怨它。这就是为什么它必须被强制转换为指针类型。

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

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

    【讨论】:

      【解决方案3】:

      类型转换有什么用.. (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,它将获得存储在内存位置0x41E 的内容。
      只需运行以下代码即可查看:

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

      输出:

      0000041E  //output is not 0x41E because '0x' is used as prefix to inform the compiler that it is a hexadecimal number
      

      【讨论】:

        【解决方案4】:

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

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

        希望对你有帮助

        【讨论】:

        • 这没有帮助,因为它是基于您对相关代码意图的误解。
        • “希望这会有所帮助”——绝对不会!这甚至是不正确的语法。你说的完全错了!
        • 更正:我删除了答案的第一部分(错误,从我这边)。
        • 关于语法:它不是 ansi C,但是,由于我们在谈论嵌入式,我报告了您在嵌入式编译器中的可能性。
        • 在任何嵌入式系统上都没有理由为此使用非标准语法。嵌入式编译器提供这种非标准方法的原因是,在设计不佳的调试器的情况下,它可以将硬件寄存器视为变量。据我所知,没有其他原因。更好的解决方案是使用 100% 标准 C,然后使用好的调试器而不是差的调试器。
        【解决方案5】:

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

        如果您使用一些固定地址,您可能正在使用char 类型最好使用的较低级别的机器,因为char 的标准规定它应为1 字节。

        【讨论】:

        • OP 没有询问char 类型。
        • 不,但他要求解释,这就是我给的。但是非易失性。如果这足以在我们的眼中投票......
        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2014-08-05
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多