如何访问结构成员作为指针
How to Access Structure Members as Pointers
我正在尝试为结构中的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++实际上不能保证结构的成员是根据以前成员的累积大小定位的。如果您试图写入第一个Person
的birthMonth
,那么它很简单:
cin >> people[0].birthMonth;
编辑:要真正解决问题的标题,如果你想要一个指向特定人的birthMonth
的int*
指针,可以使用操作员的地址:
int* birthMonth_ptr = &people[0].birthMonth;
但是,如果您想要指向任何Person
的birthMonth
成员的指针,则可以使用指向成员的指针:
// 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;
您会注意到,由于对齐要求,ptr1
和ptr2
不同。
进一步阅读:https://en.wikipedia.org/wiki/Data_structure_alignment.
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制