可以使用指针访问Embedded C++上内存位置的内容.

int *p;
p = (int*) 0x30610000;

我需要编写一个程序,将存储在内存位置的两个数字相加.

int *p;
int *q;
p = (int*) 0x30610000;
q = (int*) 0x30610004;
int sum=(*p)+(*q)

上面的代码正确吗?

我需要了解如何在嵌入式C++上访问内存位置的内容.

推荐答案

你问它是不是"correct",然后在 comments 中问它是不是"good practice".这是两个不同的问题.它在句法和语义上都是正确的(除了缺少的分号).这是否是好的做法取决于具体情况,在某种程度上也是一个意见问题.您几乎没有提供任何背景来得出观点,但请考虑以下内容:

  • 如果这些是可以在当前线程上下文之外自发改变的设备寄存器或共享存储器,则它们应该被声明为volatile
  • 如果指针永远不应该改变,则它们应该被声明为常量,
  • 优先于初始化而不是声明/赋值,
  const volatile int* p = (const volatile int*)0x30610000 ;

使用宏来表示地址上的值可能在语法上更清晰,例如:

#define p (*(volatile int*)0x30610000)
#define q (*(volatile int*)0x30610000)

int sum = p + q ;

但这可能会被视为一种混淆.您通常会通过将约定宏命名为传统的大写形式来澄清这类代码,而PQ实际上并不能将其截断.清晰或有意义.名称应反映所存储数据的用途或性质

如果值是硬件寄存器,则使用stdint.h类型,数据类型可能显式匹配寄存器宽度.

C++相关问答推荐

在C中使用JMP_buf数组进行线程化(在xv6中测试)

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

带有sigLongjMP中断I/O的异常处理程序

C由四个8位整数组成无符号32位整数

为什么STM32G474RE上没有启用RCC PLL

函数的限制限定指针参数允许优化调用方函数吗?

在Apple Silicon上编译x86的Fortran/C程序

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

C整型和_泛型.哪些类型是兼容的?

在函数外部使用内联ASM时无法指定操作数

为什么这个分配做得不好呢?

用C++构建和使用DLL的困惑

Linux分段故障(核心转储)

C23标准是否向后兼容?

正在try 理解C++中的`正在释放的指针未被分配‘错误

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

如何编写postgresql支持函数

模仿 memmove 的行为

在链表中插入一个值

为什么应该从FIFO读取的进程在read()时卡住,而另一个进程在上面成功地(似乎)写入了数据?