如何访问结构成员作为指针

How to Access Structure Members as Pointers

本文关键字:成员 指针 结构 何访问 访问      更新时间:2023-10-16

我正在尝试为结构中的birthMonth变量添加一个值。我的理解是结构成员是按顺序存储的。如果是这样的话,我不知道为什么要使用

cin >> *((short*)((people) + sizeof(Person::name)));

不将输入值存储到结构元素中。我对一个结构的成员按顺序存储的看法错了吗?

main.cpp

#include <iostream>
using namespace std;
struct Person {
char name[15];
short birthMonth;
};
int main() {
Person people[2];
cout << "Birth Month: ";
cin >> *((short*)(people + sizeof(Person::name)));
cout << people[0].birthMonth;
}

样品运行:

Birth Month: 7
0
Program ended with exit code: 0

由于内存对齐和填充,C++实际上不能保证结构的成员是根据以前成员的累积大小定位的。如果您试图写入第一个PersonbirthMonth,那么它很简单:

cin >> people[0].birthMonth;

编辑:要真正解决问题的标题,如果你想要一个指向特定人的birthMonthint*指针,可以使用操作员的地址:

int* birthMonth_ptr = &people[0].birthMonth;

但是,如果您想要指向任何PersonbirthMonth成员的指针,则可以使用指向成员的指针:

// Note that no Person object is used when defining
int Person::*member_ptr = &Person::birthMonth;
// To use the pointer though, you need an object
int a_persons_birthdate = people[0].*member_ptr;

还要注意,指向成员的指针的类型与常规指针不同,并且不能强制转换为一个。

要理解代码不起作用的原因,请添加几行来打印几个地址。

short* ptr1 = (short*)(people + sizeof(Person::name));
short* ptr2 = &(people[0].birthMonth);
std::cout << "ptr1: " << ptr1 << ", ptr2: " << ptr2 << std::endl;

您会注意到,由于对齐要求,ptr1ptr2不同。

进一步阅读:https://en.wikipedia.org/wiki/Data_structure_alignment.