C 理解指针用法

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

我是一个新的嵌入式系统开发人员,事实上,这是我在这里的第一个问题,如果你们能回答我的问题,如果你们有任何有用的嵌入式系统的网站,将非常感谢,如果张贴它

代码中u8后面的第二个指针是什么意思

#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