Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用(*variable.Member vs*variable.Member解除对struct struct_类型成员的引用_C_Pointers_Struct - Fatal编程技术网

使用(*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;
引用可以用作其上下文中的实际对象

但是,从编译器的角度来看,
(*变量)
仅在编译过程中的
立即步骤中具有意义

在最后一步(二进制),
(*变量)
失去其意义

剩下的只有
(*变量)。成员
可以解释为
变量->成员
。这意味着,获取指针
变量
,使用type
Person
解除对它的引用,从
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)