C-内存分配,为什么*符号出现在前后

C-内存分配,为什么*符号出现在前后,c,pointers,malloc,C,Pointers,Malloc,我对C很陌生,我知道*是一个指针 Person * father = (Person *) malloc(sizeof(Person)); Marriage * marriage = (Marriage *) malloc(sizeof(Marriage)); (* marriage).male = father; 我的问题是为什么*有时在前面,有时在后面?原因是什么?Person*是指向Person类型的指针 (Person*)是指向Person类型指针的C类型转换(如果不熟悉,请阅读

我对C很陌生,我知道*是一个指针

 Person * father = (Person *) malloc(sizeof(Person));
 Marriage * marriage = (Marriage *) malloc(sizeof(Marriage));
 (* marriage).male = father;

我的问题是为什么*有时在前面,有时在后面?原因是什么?

Person*
是指向Person类型的指针
(Person*)
是指向Person类型指针的C类型转换(如果不熟悉,请阅读类型转换)

(*婚姻)
是对婚姻指针的解引用,它基本上是访问指针指向的内存位置中存储的变量。还有一个提示,因为婚姻似乎是指向结构的指针,而您正在访问该结构的成员,所以您可以避免使用
(*marriage.male
语法,并使用
->
操作符,例如
marriage->male

Person*
是指向Person类型的指针
(Person*)
是指向Person类型指针的C类型转换(如果不熟悉,请阅读类型转换)

(*婚姻)
是对婚姻指针的解引用,它基本上是访问指针指向的内存位置中存储的变量。还有一个提示,因为婚姻似乎是指向一个结构的指针,并且您正在访问该结构的成员,所以您可以避免使用
(*marriation.male
语法,并使用
->
操作符,如下图所示
婚姻->male

,因此,原始代码是:

Person * father = (Person *) malloc(sizeof(Person));
Marriage * marriage = (Marriage *) malloc(sizeof(Marriage));
1) 让我们在每行的类型和变量之间放置明确的边界

(Person *) father = (Person *) malloc(sizeof(Person));
(Marriage *) marriage = (Marriage *) malloc(sizeof(Marriage));
看到了吗?所以,这里我们有一个带星号的类型,它表示一个编译器“嘿,这家伙是指向该类型的指针”。我们在右边使用相同的类型将非常通用的(void*)转换为精确的类型

2) 是时候使用我们分配的东西了。我可以说,由于语法过多,您的原始版本并没有广泛传播(这确实让您感到困惑):

更可取的方法是说:

marriage->male = father;

只需使用两个字符作为
->
,而不是在变量名周围添加所有
(*
)。
。最终结果是一样的。

所以,原始代码是:

Person * father = (Person *) malloc(sizeof(Person));
Marriage * marriage = (Marriage *) malloc(sizeof(Marriage));
1) 让我们在每行的类型和变量之间放置明确的边界

(Person *) father = (Person *) malloc(sizeof(Person));
(Marriage *) marriage = (Marriage *) malloc(sizeof(Marriage));
看到了吗?所以,这里我们有一个带星号的类型,它表示一个编译器“嘿,这家伙是指向该类型的指针”。我们在右边使用相同的类型将非常通用的(void*)转换为精确的类型

2) 是时候使用我们分配的东西了。我可以说,由于语法过多,您的原始版本并没有广泛传播(这确实让您感到困惑):

更可取的方法是说:

marriage->male = father;

只需使用两个字符作为
->
,而不是在变量名周围添加所有
(*
)。
。最后的结果是一样的。

搜索指针取消引用、指针变量声明和指针转换。顺便说一句,如果删除
malloc
返回值的
(Person*)
(Marriage*)
,可能更容易理解。也是
(*婚姻)。男性=父亲
可能更好地实现为更为惯用的
婚姻->男性=父亲@WhozCraig使用modern(即只有20年历史的C99)转换malloc并不重要,因为隐式声明是非法的,并且会导致错误搜索指针取消引用、指针变量声明和指针转换。顺便说一句,如果删除不必要的转换
(Person*)
(marry*)
malloc
返回的值进行
。还有
(*marry)。男性=父亲;
可能会更好地实现,因为更惯用的
婚姻->男性=父亲;
@WhozCraig使用现代(即只有20年历史的C99)铸造malloc并不重要,因为隐式声明是非法的,并且会导致错误