2

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

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

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

unsigned char *p=0x41E;

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

我完全糊涂了。请帮忙。

4

5 回答 5

5

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

于 2013-10-07T12:20:02.937 回答
4

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

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

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

于 2013-10-07T12:14:54.477 回答
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
于 2013-10-07T12:15:02.273 回答
1

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

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

希望这可以帮助

于 2013-10-07T12:24:10.627 回答
0

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

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

于 2013-10-07T12:17:48.490 回答