我在书籍和嵌入式系统相关站点中看到了很多这样的例子。根据我的理解,它用于访问存储在该固定内存地址中的数据。这是我在某本书中得到的示例;
unsigned char *p=(unsigned char *)0x41E;
类型转换(unsigned char *)
有什么用,我们可以直接使用
unsigned char *p=0x41E;
请详细解释一下,那里的类型转换有什么用,我们是将地址0x41E
本身存储到指针p
还是存储其他东西?
我完全糊涂了。请帮忙。
我在书籍和嵌入式系统相关站点中看到了很多这样的例子。根据我的理解,它用于访问存储在该固定内存地址中的数据。这是我在某本书中得到的示例;
unsigned char *p=(unsigned char *)0x41E;
类型转换(unsigned char *)
有什么用,我们可以直接使用
unsigned char *p=0x41E;
请详细解释一下,那里的类型转换有什么用,我们是将地址0x41E
本身存储到指针p
还是存储其他东西?
我完全糊涂了。请帮忙。
强制转换主要是为了让编译器满意,但在某些体系结构中,指针地址必须转换为某种格式,而不仅仅是数字的普通位。例如,在分段架构中,演员表中可能涉及实际的转换。但是,就最终结果而言,(char *)0x41E
仅意味着“将数字 0x41E 解释为指针地址”,取消引用它会获取该地址处的字符。
该值0x41e
不是指针,因此编译器会抱怨它。这就是为什么它必须被类型转换为指针类型。
指针是普通变量,其内容(值)是指针指向的地址。它由编译器特殊处理,以在取消引用指针时访问指针指向的内容。
至于“固定地址变量”,许多嵌入式平台在特殊的固定地址上都有数据和/或寄存器。要访问这些数据或这些寄存器,您通常使用初始化到这些地址的指针。
类型转换有什么用.. (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
考虑到,在许多嵌入式世界的编译器中,您可以指定特定地址(例如 IAR 编译器)
const unsigned char test_var @0x41E = 'a';
希望这可以帮助
char
type 是 C 中的一种可移植性类型。char *
因为从 c99 开始,每个内存区域都允许使用 a 别名。因此,如果您不知道预期的类型,或者您甚至不得不使用不同的类型,那么如果您使用 type ofchar *
对类型进行别名,那么您是安全的。
如果您使用一些固定地址,您可能正在使用较低级别的机器,其中char
类型最好使用,因为标准规定char
它应该是 1 字节。