我写了下面的程序。
#include<stdio.h>
#include<stdlib.h>
struct Test
{
int count;
};
void main()
{
struct Test *ptr;
struct Test test;
ptr = malloc(sizeof(struct Test));
if ( ptr)
{
ptr->count = 123;
test.count = 456;
printf("count : %d ",(*ptr).count);
printf("count : %d ",(&test)->count);
}
else
{
printf(" malloc failed \n");
}
}
程序的输出: 数:123 数:456
任何人都可以在此代码中说明如何表示(* ptr).coun t和(&test)-> count 以及其工作方式吗?
答案 0 :(得分:1)
(&test)->count
等效于(*(&test)).count
。要了解更多信息,您可以浏览Arrow operator (->) usage in C
答案 1 :(得分:1)
好吧,translatex(${globalVar}px)
基本上是a->x
的缩写,只是使用指向结构的指针在C语言中很常见,因此该语法还有一些额外的糖可以简化它。在我看来,不需要括号是很有帮助的。
基本上,当左侧的值是(*a).x
类型时使用.
,而当它是结构的地址时使用struct
。
答案 2 :(得分:1)
所以ptr
和test
是2个不同类型的变量。 ptr
是指向struct Test
的指针,而test
只是是该结构。通常,您通过间接访问指针的值(用->
代替.
来访问指针)。
要重新分配指针,首先必须取消引用,这是使用*
运算符完成的,因此:(*ptr).count
的基本理解为:得到ptr
指向的值并使用它。整个表达式基本上是ptr->count
的长格式。
(&test)->count
有点愚蠢。您在堆栈上有一个对象,但不是快速而廉价地访问其字段,而是获得内存地址(&
就是这样做的-它是“ 操作符的地址),并创建一个就地指针。然后,您将使用间接获取存储在count
中的值。表达式(&test)->count
读为:“给我一个指向test
的指针,并使用该指针访问字段count
” 。这样就相当于*(&test).count
有点多余。