在下面的代码中如何将* ptr与(。)和(&test)一起与->一起使用?

时间:2019-09-02 09:45:04

标签: c pointers struct

我写了下面的程序。

#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 以及其工作方式吗?

3 个答案:

答案 0 :(得分:1)

(&test)->count等效于(*(&test)).count。要了解更多信息,您可以浏览Arrow operator (->) usage in C

答案 1 :(得分:1)

好吧,translatex(${globalVar}px)基本上是a->x的缩写,只是使用指向结构的指针在C语言中很常见,因此该语法还有一些额外的糖可以简化它。在我看来,不需要括号是很有帮助的。

基本上,当左侧的值是(*a).x类型时使用.,而当它是结构的地址时使用struct

答案 2 :(得分:1)

所以ptrtest是2个不同类型的变量。 ptr是指向struct Test的指针,而test只是该结构。通常,您通过间接访问指针的值(用->代替.来访问指针)。

要重新分配指针,首先必须取消引用,这是使用*运算符完成的,因此:(*ptr).count的基本理解为:得到ptr指向的值并使用它。整个表达式基本上是ptr->count的长格式。

另一方面,

(&test)->count有点愚蠢。您在堆栈上有一个对象,但不是快速而廉价地访问其字段,而是获得内存地址(&就是这样做的-它是操作符的地址),并创建一个就地指针。然后,您将使用间接获取存储在count中的值。表达式(&test)->count读为:“给我一个指向test的指针,并使用该指针访问字段count。这样就相当于*(&test).count有点多余。