是c 解除lvalue或rvalue

Is a c++ dereference an lvalue or an rvalue?

本文关键字:rvalue lvalue 解除      更新时间:2023-10-16

我有信心我了解rvaluelvalue的含义。我不清楚的是解除是否是rvalue

考虑一下:

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

gpfsel1是对未签名的int指针的解释。未签名的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;
    } 
}

" deReference"是一个动词 - 您将指示指向访问指向的值的指针。

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

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;

您的当前方法可以正常工作,您只需要适当地初始化成员变量,例如

struct MotorControl control;
control.MYGPFSEL = (volatile unsigned int *)(AUX_MU_BASE + 0x4);

另外,您可以将其初始化为

control = &GPFSEL1; 

鉴于您已将gpfsel1定义为原来的问题:

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

现在您可以阅读寄存器:

 foo = *control.MyGPFSEL;

或设置寄存器:

 *control.MyGPFSEL = 123;

这是一个很容易回答的问题,解雇可以是作业的左侧,因此它是L值。

易于说明的案例:

char sz[] {"hello"};
*sz = 'j';

如果某物可以是作业的左侧,则根据定义是l值。