C 理解指针用法
我是一个新的嵌入式系统开发人员,事实上,这是我在这里的第一个问题,如果你们能回答我的问题,如果你们有任何有用的嵌入式系统的网站,将非常感谢,如果张贴它 代码中u8后面的第二个指针是什么意思C 理解指针用法,c,pointers,embedded,atmega,C,Pointers,Embedded,Atmega,我是一个新的嵌入式系统开发人员,事实上,这是我在这里的第一个问题,如果你们能回答我的问题,如果你们有任何有用的嵌入式系统的网站,将非常感谢,如果张贴它 代码中u8后面的第二个指针是什么意思 #define DDRA (*(volatile u8*) 0x3A) 宏 #define DDRA (*(volatile u8*) 0x3A) 正在使用(volatile u8*)强制转换0x3A作为指向8位值的指针,然后第一个*将延迟该指针。它正在访问内存映射端口控制寄存器 需要使用volatile
#define DDRA (*(volatile u8*) 0x3A)
宏
#define DDRA (*(volatile u8*) 0x3A)
正在使用(volatile u8*)
强制转换0x3A
作为指向8位值的指针,然后第一个*
将延迟该指针。它正在访问内存映射端口控制寄存器
需要使用volatile
关键字来防止编译器优化对寄存器的引用,因为它是一个硬件位置
例如,在微控制器中设置端口A数据方向时:
#define DDRA (*(volatile char*) 0x3A)
int main()
{
DDRA = 0x2A;
// etc...
}
代码中u8后面的第二个指针是什么意思
#define DDRA (*(volatile u8*) 0x3A)
我想你说的是第二个“*”
u8*
是“指向u8的指针”类型
添加()就像
(*((volatile u8*) 0x3A))
因此,0x3A
被视为u8(u8*
)的地址,第一个“*”将其取消引用,以便(*((易失性u8*)0x3A))
尝试返回地址0x3A
处的u8(如果0x3A不是有效地址,则会产生分段错误)或者在赋值的左侧尝试在地址0x3A处写入
例如,将u8定义为字符,并用全局变量的地址替换0x3A:
#include <stdio.h>
#define DDRA (*(volatile u8 *) &A)
typedef char u8;
int A = 'a';
int main()
{
printf("%c\n", DDRA);
DDRA = 'b';
printf("%c\n", DDRA);
return 0;
}
u8*与*u8相同?@mahmoudosama no,
u8*
是类型“指向一个u8的指针”(假设不是u8乘以某物;-),但*u8
尝试遵从u8(如*((char*)“ab”)
返回“a”@mahmoudosama否,u8
是一个类型,*u8
试图取消引用一个类型,这没有意义。*
放在类型名称之后,表示它是指向该类型的指针。它不是指针,而是星号。在这里,第二个星号表示类型应该是指针。t第一个星号不是用来组成指针,而是用来取消引用指针。
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
a
b