C语言中,箭头符号 “->” 和点号符号 “.”的区别

在C语言中,箭头符号 “->” 用于访问结构体(struct)或联合体(union)类型的成员。它可以替代点号(.)来访问结构体或联合体的成员,当通过指针访问时使用箭头符号。例如,假设有一个结构体类型的指针变量p,其中包含成员变量x,可以使用箭头符号来访问x,例如 p->x。这是因为p是一个指针,而不是结构体本身。



箭头符号 “->” 和点号符号 “.” 在C语言中都用于访问结构体或联合体类型的成员,但它们之间有一些重要的区别。

  1. 语法:

    • 点号 “.” 主要用于直接访问结构体或联合体变量的成员。例如,如果有一个结构体变量s,其中包含成员变量x,可以使用 s.x 访问 x。
    • 箭头符号 “->” 主要用于通过指针访问结构体或联合体的成员。例如,如果有一个指向结构体的指针变量p,其中包含成员变量x,可以使用 p->x 访问 x。
  2. 对象类型:

    • 点号 “.” 用于直接访问结构体或联合体变量的成员。
    • 箭头符号 “->” 用于通过指针访问指向结构体或联合体的成员。
  3. 使用场景:

    • 点号 “.” 主要用于直接操作结构体或联合体变量。
    • 箭头符号 “->” 主要用于通过指针操作结构体或联合体。

总之,点号和箭头符号在访问结构体或联合体成员时使用的语法和对象类型有所不同,取决于你是直接操作变量还是通过指针访问。



以下是两个例子来对比点号 “.” 和箭头符号 “->” 的不同之处

例子1:使用点号 “.”

#include <stdio.h>

struct Person {
   char name[20];
   int age;
};

int main() {
   struct Person p1;

   strcpy(p1.name, "John");
   p1.age = 25;

   printf("Name: %sn", p1.name);
   printf("Age: %dn", p1.age);

   return 0;
}

输出:

Name: John
Age: 25

在这个例子中,我们声明了一个结构体类型 Person,并使用点号 “.” 直接访问结构体变量 p1 的成员。通过赋值和打印语句,我们直接操作 p1 的成员变量 name 和 age。

例子2:使用箭头符号 “->”

#include <stdio.h>
#include <stdlib.h>

struct Person {
   char name[20];
   int age;
};

int main() {
   struct Person *p2;

   p2 = (struct Person*) malloc(sizeof(struct Person));

   strcpy(p2->name, "Emily");
   p2->age = 32;

   printf("Name: %sn", p2->name);
   printf("Age: %dn", p2->age);

   free(p2);

   return 0;
}

输出:

Name: Emily
Age: 32

在这个例子中,我们声明了一个指向结构体的指针变量 p2,并使用箭头符号 “->” 通过指针访问结构体的成员。通过动态内存分配(malloc)来分配结构体内存,并操作 p2 指向的结构体的成员变量 name 和 age。

通过这两个例子,你可以看到点号 “.” 和箭头符号 “->” 在语法和使用方式上的不同。点号用于直接操作结构体变量的成员,而箭头符号用于通过指针访问结构体的成员。