2014-01-07 96 views
0

我对C相当陌生,正试图用七段显示器编写一些基本应用程序。在声明的绝对地址,一个8位端口,我可以写的东西,如:在微芯片上声明/处理输出端口

typedef char *port8ptr; 
#define OUT_ADR 0x400 
#define OUT *((port8ptr) OUT_ADR) 

,然后简单地设置可变出像

OUT = 0x80; 

获得十六进制80到端口。但是,上面的代码究竟意味着什么?也就是说,为什么要定义一个指针(第一行),然后将该地址转换为指针(?!)的指针?它显然有效,但我真的不喜欢使用我无法理解的例子中的代码。

另一种方式他们做了类型转换为与线

((unsigned char *) 0x400) 

但我真的不明白,要么。

非常感谢提前!这里

阿克塞尔

回答

1

当你完成所有的预处理你得到这一行:

*((char*)0x400) = 0x80; 

让我们来仔细研究这个。 (char *)0x400表示将数字0x400转换为“指向字符的指针”。基本上它在这里说:让我们创建一个指向地址0x400的指针。

然后,我们将其前面的*表示“取消引用”,这使得您实际上可以在指针指向的内存点中写入内容,在这种情况下地址为0x400。然后你在其中写入0x80

+0

谢谢,我想我现在得到它!所以基本上,我们对“(port8ptr)OUT_ADR”这行的操作是将地址转换为指针,然后将它解引用,以便在表达式的前面用asterix实际上将某些东西写入端口? – user2950764

+1

是的,就是这样。 –

1

的困惑是第二行 - 你认为这是一个转换为指针的指针,而它实际上是一个指针的强制的解引用。

让我们回到基础。保存您对这个角色

char c = 'A'; 
char *p = &c; 

你可以解引用p,得到回C字符和指针 - printf('%c', *p)将打印,并*p='B'将C'S内容更改为B.

另一个基本的东西是将整数转换为指针 - ((char *)0x400)表示指向地址0x400处的字节的指针。

所以第二线实际上意味着“写0x80到字节地址0x400”

+1

谢谢!但是,我可以简单地写“char * ptr; ptr = 0x400; * ptr = 0x80”。在我看来,这应该启动一个指针,将“指针地址”设置为0x400,然后将其解引用并将0x80写入ptr指向的位置? – user2950764

+0

你是对的,你可以做到这一点。 – zmbq

1

语言B和C之间的大的差异,是下加入的类型。因此,您可以在某处指定地址,并且该类型会告诉编译器是否需要为该值加载一个,两个,四个或更多字节。因此,虽然您可以指向系统中的任何地址,但您需要向编译器提供有关要加载的位置处有多少个字节的附加信息。这些都会做不同的负载:

int x1= * (unsigned char *) 0x400 ; 
int x2= * (unsigned short *) 0x400 ; 
int x4= * (unsigned int *) 0x400 ; 

所以x1将会从0x400有一个字节的数据,而x4都将有四个字节。这就是为什么你告诉编译器什么地址,然后要求它在那里查找值。

+0

谢谢!这种类型的ting是我必须检查更多,特别是在使用指针算术时。 – user2950764