首页 > 编程笔记

C语言结构体指针

在 C语言中,结构体指针是一种非常有用的数据类型,它可以让我们更方便地操作结构体。结构体指针可以指向结构体的实例,从而允许我们访问结构体中的成员变量,并对这些成员变量进行赋值、修改、删除等操作。

本文将介绍 C语言中结构体指针的基础概念和使用方法,并提供一些示例代码来帮助读者更好地理解。

什么是结构体指针?

在 C语言中,结构体指针是一个指向结构体的指针变量。与其他指针一样,结构体指针也可以指向任何类型的结构体。结构体指针变量的声明方式与其他指针变量相同,只是需要在类型名前加上 struct 关键字,以指明其指向的是一个结构体类型的变量。

例如,以下是一个指向结构体类型 person 的指针变量的声明:
struct person *p;
上面的声明定义了一个指向结构体类型 person 的指针变量 p。这意味着我们可以使用 p 指针变量来访问 person 结构体中的成员变量。

如何访问结构体成员?

使用结构体指针访问结构体成员的方法与使用点运算符.访问结构体成员的方法类似。但是,在使用结构体指针访问结构体成员时,需要使用箭头运算符->。箭头运算符->用于将指针解引用,并访问指向结构体的成员。

例如,假设我们有以下结构体类型:
struct person {
    char name[20];
    int age;
};
我们可以使用以下代码来访问结构体中的成员变量:
struct person p;
p.age = 20;
这将为结构体实例 p 的 age 成员变量分配值 20。同样,我们也可以使用结构体指针来访问结构体中的成员变量:
struct person *p;
p = (struct person *)malloc(sizeof(struct person));
p->age = 20;
上面的代码首先分配了一个 person 类型的内存块,并将其地址赋值给p指针变量。然后,我们使用箭头运算符->将指针解引用,并访问指向结构体的 age 成员变量。

如何传递结构体指针作为参数?

在函数中传递结构体指针作为参数时,我们需要在函数声明中指定参数的类型为指向结构体类型的指针变量。在函数调用时,我们可以将结构体实例的地址传递给函数,以便在函数内部访问结构体中的成员变量。

例如,下面的示例代码演示了如何将结构体指针作为参数传递给函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

void print_person_info(struct person *p)
{
    printf("Name: %s\n", p->name);
    printf("Age: %d\n", p->age);
}

int main()
{
    struct person *p;
    p = (struct person *)malloc(sizeof(struct person));
    strcpy(p->name, "John");
    p->age = 30;
    print_person_info(p);
    free(p);
    return 0;
}
在上面的代码中,我们首先定义了一个指向 person 类型的指针变量 p,并使用 malloc 函数动态分配了一个 person 类型的内存块。然后,我们通过 strcpy 函数将"John"字符串复制到了 person 结构体中的 name 成员变量中,将 30 分配给 age 成员变量。

接下来,我们调用了 print_person_info 函数,并将 p 指针变量作为参数传递给了它。在函数内部,我们使用箭头运算符->访问指向结构体的成员变量,并输出了结构体中的信息。

最后,我们使用 free 函数释放了 p 指针变量指向的内存块,以避免内存泄漏。

结构体指针数组

除了指向单个结构体的指针变量外,我们还可以定义一个指向结构体指针的数组。结构体指针数组可以用于存储多个指向结构体的指针变量,并通过数组下标来访问它们。

例如,以下是一个指向 person 结构体的指针数组的定义:
struct person *people[3];
上面的代码定义了一个大小为 3 的结构体指针数组 people,每个元素都是一个指向 person 结构体的指针变量。我们可以使用以下代码为数组中的每个元素分配内存块,并将结构体指针变量存储在数组中:
for (int i = 0; i < 3; i++) {
    people[i] = (struct person *)malloc(sizeof(struct person));
}
然后,我们可以使用以下代码为每个结构体指针变量的成员变量赋值:
strcpy(people[0]->name, "John");
people[0]->age = 30;

strcpy(people[1]->name, "Mary");
people[1]->age = 25;

strcpy(people[2]->name, "Tom");
people[2]->age = 40;
最后,我们可以使用以下代码访问结构体指针数组中的每个元素,并输出它们的信息:
for (int i = 0; i < 3; i++) {
    printf("Person %d:\n", i+1);
    printf("Name: %s\n", people[i]->name);
    printf("Age: %d\n", people[i]->age);
}
输出结果如下:

yaml
Copy code
Person 1:
Name: John
Age: 30
Person 2:
Name: Mary
Age: 25
Person 3:
Name: Tom
Age: 40

在上面的代码中,我们首先使用循环分配了一个大小为 3 的结构体指针数组,每个元素都是一个指向 person 结构体的指针变量。然后,我们为每个结构体指针变量的成员变量赋值。

接下来,我们使用循环遍历结构体指针数组中的每个元素,并输出了它们的信息。

最后,我们使用循环释放了每个指针变量指向的内存块,以避免内存泄漏。注意,在释放内存块之前,我们必须先释放每个结构体指针变量指向的内存块,因为它们是我们在程序中手动分配的内存块。

总的来说,结构体指针是 C语言中非常重要的概念,它们允许我们通过指针变量来访问结构体中的成员变量,并以此来操作复杂的数据结构。同时,结构体指针也具有动态内存分配和函数参数传递等重要的应用。我希望这篇文章能够帮助你更好地理解 C语言中的结构体指针。

推荐阅读