【问题标题】:Understanding pointer usage [duplicate]了解指针用法[重复]
【发布时间】:2019-04-21 10:01:30
【问题描述】:

我是一个新手嵌入式系统开发人员,实际上,这是我在这里的第一个问题,如果你们也可以回答我的问题,如果你们有任何有用的嵌入式系统网站,如果发布它,将不胜感激。

这段代码中u8之后的第二个指针是什么意思?

#define DDRA (*(volatile u8*) 0x3A)

【问题讨论】:

  • 它不是指针,它是一个星号。在那里,第二个星号表示 type 应该是一个指针。 first 星号不是用于形成指针,而是用于取消引用。

标签: c pointers embedded atmega


【解决方案1】:

#define DDRA (*(volatile u8*) 0x3A)

正在使用(volatile u8*)0x3A 转换为指向8 位值的指针,然后第一个* 正在推迟该指针。它正在访问一个内存映射的端口控制寄存器。

需要volatile 关键字来防止编译器优化掉对作为硬件位置的寄存器的引用。

一个示例用法是在微控制器中设置端口 A 数据方向时:

#define DDRA (*(volatile char*) 0x3A)

int main()
{
    DDRA = 0x2A;
    // etc...
}

【讨论】:

  • u8* 和 *u8 一样吗?
  • @mahmoudosama 不,u8* 是类型“指向 u8 的指针”(假设不是 u8 倍 ;-))但 *u8 尝试尊重 u8(如*((char*) "ab") 返回'a'
  • @mahmoudosama 不,u8 是一个类型,*u8 试图取消引用一个类型,这没有意义。 * 放在类型名称之后,表示它是指向该类型的指针。
【解决方案2】:

这段代码中u8之后的第二个指针是什么意思?

我想你说的是第二个“*”

u8* 是类型“指向 u8 的指针”

(*(volatile u8*) 0x3A)

加上()就像

(*((volatile u8*) 0x3A))

所以0x3A 被认为是u8 (u8*) 的地址并且第一个“*”取消引用它所以(*((volatile u8*) 0x3A)) 尝试返回u8 在地址 0x3A(如果 0x3A 不是有效地址,它将产生分段错误)或在分配的左侧尝试写入地址 0x3A

例如将 u8 定义为 char 并将 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;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
a
b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多