gpt4 book ai didi

c++ - c++ 解引用是左值还是右值?

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:16 24 4
gpt4 key购买 nike

我确信我理解rvaluelvalue 的含义。我不清楚取消引用是否是 rvalue

考虑一下:

#define GPIO_BASE             0x20200000
#define GPFSEL1 (*(volatile unsigned int *)(AUX_MU_BASE + 0x4))

GPFSEL1 是对 unsigned int 指针的取消引用。该 unsigned int 指针是硬件寄存器的物理地址。

我读到这是裸机编程中直接访问硬件寄存器的常用技术。到目前为止,我可以毫无问题地使用它。

现在我想要一个 referenceGPFSEL1 作为结构的成员。这可能吗?

struct MotorControl
{
u8 pwm_pin;
u8 ctrla_pin;
u8 ctrlb_pin;
volatile unsigned int* MYGPFSEL; // this is not the same thing so does not work
}

鉴于下面的这个函数,引用别处定义的 GPFSEL1 的正确方法是什么,以及如何取消引用它以设置它的值?

MotorContorl group
group.MYGPFSEL = ?
void set(unsigned char pin_number, bool high)
{
if (high)
{
// how to correct this statement
group.MYGPFSEL |= 1<< pin_number;
}
}

最佳答案

“取消引用”是一个动词 - 您取消引用指针以访问它指向的值。

类型转换很简单 - 如果您有一个指向整数的指针,并且您取消引用它,那么您现在正在使用一个整数。它是一个左值,因为它(通过构造)在内存中占据一个位置,并且您可以(通常)修改它。

int x = 10;
int* xptr = &x;
*xptr = 5; // *xptr is an lvalue
std::cout << "X: " << x << std::endl; // Prints 5

但是,指针需要指向内存中的某个地方。如果你只是开始

int* xptr;
*xptr = 5;

你会得到一个错误,因为你试图取消引用一个没有指向有效内存地址的指针。 (如果确实如此,那纯属巧合,您会错误地更改该值。)

如果您希望引用 GPFSEL1 作为您的 MotorControl 结构的成员,您将无法在不将结构传递给它要引用的对象的情况下初始化该结构。您可能想要的是结构内部的指针,它更容易使用:

MotorControl myMotorControl;
myMotorControl.MYGPFSEL = GPFSELF1;

关于c++ - c++ 解引用是左值还是右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com