【发布时间】:2020-10-03 07:17:04
【问题描述】:
我试图了解当取消引用指向结构的指针时我们得到什么值。
我的结构是。
struct car
{
int a = 5;
int b = 10;
int c = 2;
int d = 14;
int e = 20;
};
我在 main 函数中的代码是
int main()
{
car k1,k2,k3,k4,k5; // declare struct variable
car* ptr1,*ptr2,*ptr3,*ptr4,*ptr5;// declare pointer to struct variable
ptr1 = &k1;
ptr2 = &k2;
ptr3 = &k3;
ptr4 = &k4;
ptr5 = &k5;
printf("*ptr1=%d *ptr2=%d *ptr3=%d *ptr4=%d *ptr5=%d \n", *ptr1,*ptr2,*ptr3,*ptr4,*ptr5);
};
当我取消对 ptr1 到 ptr5 的引用时。我得到的值与结构中成员的值相对应(值 a 到 e)。为什么我得到这个值。
【问题讨论】:
-
这不是 C 代码。 C 不允许这样的结构字段初始化器。也许您正在使用 C++ 进行编码。如果是,请更新标签。
-
你能澄清一下你的程序输出什么,你希望它输出什么。
-
When I dereference ptr1 to ptr5当您这样做时,您会将struct car值传递给printf,由于%d的原因,它需要int值。那就是UB(未定义的行为)。 -
您混淆了 C 结构和 C++ 结构。在 C 中,结构的地址是第一个成员的地址。因此,您可以通过取消引用结构来打印第一个整数成员。 (这解释了您使用
printf和"%d"转换说明符)在 C++ 中,结构和类彼此相同,但从第一个成员的角度来看,不能保证与 C 结构相同。见First member of class -
如果您尝试使用
std::cout输出,您也使用printf绕过error: no match for ‘operator<<’,但您使用printf调用Undefined Behavior,因为*ptr1等和"%d"之间的类型不匹配。您可以通过将指针转换为int*来屏蔽它,例如*(int*)ptr1-- 但是如果你不得不绕过一个错误 -- 无论如何,所有的希望都会失去......这看起来很像 XY 问题。见:What is the XY problem?——你需要完成什么?
标签: c++