使用(*variable.Member vs*variable.Member解除对struct struct_类型成员的引用
鉴于: 然后,解引用采用一般形式:使用(*variable.Member vs*variable.Member解除对struct struct_类型成员的引用,c,pointers,struct,C,Pointers,Struct,鉴于: 然后,解引用采用一般形式: typedef struct Person_struct { char name[10]; int age; } Person; Person bob; void makePerson(Person *human) { strcpy((*human).name, "Bob Bee"); (*human).age = 36; } 我知道成员访问操作符的优先级高于*,因此我们首先使用括号来取消对变量的引用。我真的不明白为什么这是必要的 实际上,*
typedef struct Person_struct { char name[10]; int age; } Person;
Person bob;
void makePerson(Person *human) {
strcpy((*human).name, "Bob Bee");
(*human).age = 36;
}
我知道成员访问操作符
的优先级高于*
,因此我们首先使用括号来取消对变量的引用。我真的不明白为什么这是必要的
实际上,*variable.member
将首先对member-access操作符进行操作以获取指向struct\u类型的指针,然后。member
将添加sizeof(member)
以获取要延迟的位置
但是正确的形式(*变量).member
非常不直观。不清楚(*变量)
实际返回的“值”是什么,也不清楚如何从返回的内容访问成员
我的问题是:
当使用(*变量).member
与*变量.member
相反时,内存中发生了什么
我看到了,但它没有回答我的问题。您不能使用
*变量的原因。member
是因为本例中的变量是指针,而不是结构,并且您不能在指针上使用member access操作符。我们有一个单独的操作符->
,用于对取消引用的指针进行成员访问:
(*variable).member //variable could be bob, member could be age
我知道成员访问操作符
的优先级高于*
,因此我们首先使用括号来取消对变量的引用。我真的不明白为什么这是必要的
您刚才说过:成员访问操作符
优先于解除引用操作符*
。如果你问为什么
具有优先权,那只是一个设计选择
正确的形式(*变量)。成员非常不直观
我认为这是令人讨厌的,而不是不直观的。事实上,这是一个非常常见的操作,它有一个操作符。当有指向结构的指针时,可以使用->
操作符访问结构的字段
strcpy(human->name, "Bob Bee");
当使用(*变量).member
与*变量.member
相反时,内存中发生了什么
执行(*variable).member
与“获取变量中的地址并取消引用,然后获取刚获得的结构的成员
字段”相同
执行*变量.member
与说“在结构变量的成员
字段中获取地址,然后取消引用”相同。如果变量是指针,那当然是错的。问得好
这在很大程度上取决于编译器如何处理符号的含义
例如,在C++中,语句<代码>(*VALUTION),成员< /COD>,<代码>(*VALUTION)< /C> >可以解释为<代码>引用< /代码>到实际对象。
Person-bob;
Person*ptr=&bob;
Person&ref=*ptr;
引用可以用作其上下文中的实际对象
但是,从编译器的角度来看,(*变量)
仅在编译过程中的立即步骤中具有意义
在最后一步(二进制),(*变量)
失去其意义
剩下的只有(*变量)。成员
可以解释为变量->成员
。这意味着,获取指针变量,使用typePerson
解除对它的引用,从Person
结构的原型中获取实际属性
例如:
struct-Person{
字符*名称;
智力年龄;
};
人鲍勃;
printf(“%d\n”,bob.age);
可能的二进制代码可以是
human->age = 36
// same as
(*human).age = 36
希望能有所帮助他的问题是“内存中发生了什么…”:)为什么不使用->
?
1. advance stack pointer about `sizeof(Person) = 16 bytes` (determined at compile time for 64bit machine). Top of the stack now contains the value of object bob
2. put the last 8 bytes on top of the stack into `printf` function. (You are gonna learnt more about this later)