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

时间:2018-07-13 19:25:36

标签: c++ pointers

我试图在我的结构中将birthMonth变量的值设为cin。我的理解是结构成员按顺序存储。如果是这样,我无法找出为什么使用

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

2 个答案:

答案 0 :(得分:3)

由于内存对齐和填充,C ++实际上不提供任何保证根据先前成员的累积大小来定位结构的成员。如果您要写第一个Person的{​​{1}},它很简单:

birthMonth

编辑:实际上要解决问题的标题,如果您想要指向特定人员的cin >> people[0].birthMonth; 的{​​{1}}指针,则可以使用地址运算符完成此操作:

int*

但是,如果您想要指向 any birthMonth的{​​{1}}成员的指针,则可以使用pointer-to-member

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

还请注意,指向成员的指针与常规指针的键入方式不同,因此不能将其强制转换为一个指针。

答案 1 :(得分:1)

要了解为什么您的代码不起作用,请添加几行以打印几个地址。

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