结构体和结构体指针的区别

2024-06-15 08:48:28 浏览数 (2)

1.定义区别

结构体的定义如下:

代码语言:javascript复制
struct 结构体名 {
    数据类型 成员变量名1;
    数据类型 成员变量名2;
    // 可以有更多的成员变量
};

例如,定义一个表示学生的结构体:

代码语言:javascript复制
struct Student {
    int id;
    char name[20];
    int age;
};

上述定义了一个名为Student的结构体,包含了三个成员变量idnameage,分别表示学生的学号、姓名和年龄。

结构体指针的定义如下:

代码语言:javascript复制
struct 结构体名 *指针变量名;

例如,定义一个指向Student结构体的指针变量:

代码语言:javascript复制
struct Student *stuPtr;

上述定义了一个指针变量stuPtr,类型为指向Student结构体的指针。

结构体指针可以用来指向已经存在的结构体对象,也可以用来动态创建新的结构体对象。例如,动态创建一个Student对象并用指针指向它:

代码语言:javascript复制
struct Student *stuPtr = (struct Student*)malloc(sizeof(struct Student));

在上述示例中,malloc()函数用来分配内存以存储一个Student结构体大小的空间,返回的指针被转换为struct Student*类型,然后赋值给stuPtr指针变量。

结构体指针可以直接通过指针访问结构体的成员变量,例如stuPtr->id表示访问指针stuPtr所指向的结构体的id成员变量。

需要注意的是,在使用完动态分配的结构体内存后,需要使用free()函数释放内存,以避免内存泄漏。

总结起来,结构体定义了一种用户自定义的数据类型,可以包含多个成员变量;结构体指针用来指向结构体对象或动态创建的结构体对象,并可以通过指针访问结构体的成员变量。

2.以链表为例具体解析

链表是一种动态的数据结构,用于存储和表示一组元素,每个元素由数据和一个指向下一个元素的指针组成。对于链表的操作通常使用结构体来表示一个节点,节点中包含存储的数据以及指向下一个节点的指针。 在链表中,结构体表示节点,每个节点包含数据和指向下一个节点的指针。通过不断将节点连接起来,就形成了一个完整的链表结构。 使用结构体来表示链表的节点可以方便地操作链表,例如插入、删除和查找节点等操作。而使用结构体指针则可以更方便地操作节点的指针,例如改变节点的指向。

具体来说,定义一个链表节点的结构体如下:

代码语言:javascript复制
struct Node {
    int data;
    struct Node *next;
};

其中,data表示节点存储的数据,next表示指向下一个节点的指针。

使用结构体指针来创建链表,可以方便地操作节点的指针。例如,创建一个链表的头节点并添加两个节点的示例代码如下:

代码语言:javascript复制
struct Node *head = NULL; // 链表的头节点

// 创建第一个节点
struct Node *node1 = (struct Node*)malloc(sizeof(struct Node));
node1->data = 1;
node1->next = NULL;

// 创建第二个节点
struct Node *node2 = (struct Node*)malloc(sizeof(struct Node));
node2->data = 2;
node2->next = NULL;

// 将节点连接起来
head = node1;
node1->next = node2;

在上述示例中,head是一个指向链表头节点的指针变量。通过结构体指针可以方便地访问和操作节点的成员变量,例如node1->data表示访问第一个节点的数据。

总结起来,结构体和结构体指针的区别在于结构体表示数据类型,而结构体指针表示指向结构体的指针变量。在链表中,通过结构体表示节点,通过结构体指针操作节点的指针,从而实现链表的各种操作

0 人点赞