如果有结构说
struct first
{
int a;
int b;
};
现在如果我创建它的对象
int main(){
struct first ob1,ob2;
ob1.a=5;
printf("%u %u",&ob1,&(ob1.a)); //prints same address
printf("%d %d",ob1,(ob1.a)); // 5,garbage value
return 0;}
我的教授说ob1是指向结构的指针。我想知道ob1和ob1.a的地址是什么,它们存储的是什么价值?
同样在c ++中,我们有 this pointer 来为ob1.a和ob2.a赋值。在C中,编译器如何知道存储值的对象?
答案 0 :(得分:3)
ob1
绝不是指针。这是一种结构。
由于a
是struct first
的第一个字段,&ob1
和&ob1.a
是相同的地址(但具有不同的类型)。
在C中,编译器知道要存储哪个对象,因为你必须告诉它。在您的情况下,您分别说过ob1.a
或ob2.a
。
编辑说明:使用%p
打印指针,不要试图将结构传递给printf
。
答案 1 :(得分:2)
这一行引发了未定义的行为,因为printf
期望第一个参数是int
,但是你传递了一个包含两个整数的struct
:
printf("%d %d",ob1,(ob1.a)); // 5,garbage value
它在你的情况下打印5
和垃圾值的原因是你的编译器如何将参数传递给函数:它将ob1
的副本放在堆栈上,然后是ob1的副本。一个。由于a
是第一个字段,因此在堆栈上推送ob1
相当于在堆栈上首先推送ob1.a
然后推送ob1.b
。因此上面的printf
相当于:
printf("%d %d", ob1.a, ob1.b, ob1.a); // 5,garbage value
因此,打印的第一个值是5,这是为ob1.a
提供的值,后面是ob1.b
中发生的任何垃圾。
毋庸置疑,在另一个系统或其他编译器上,您可以看到完全不同的东西。