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

简介: 结构体和结构体指针的区别

1.定义区别


结构体的定义如下:


struct 结构体名 {
    数据类型 成员变量名1;
    数据类型 成员变量名2;
    // 可以有更多的成员变量
}

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


struct Student {
    int id;
    char name[20];
    int age;
};
 

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


结构体指针的定义如下:


struct 结构体名 *指针变量名;

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


struct Student *stuPtr;

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


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


struct Student *stuPtr = (struct Student*)malloc(sizeof(struct Student));

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


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


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


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


2.以链表为例具体解析


链表是一种动态的数据结构,用于存储和表示一组元素,每个元素由数据和一个指向下一个元素的指针组成。对于链表的操作通常使用结构体来表示一个节点,节点中包含存储的数据以及指向下一个节点的指针。

在链表中,结构体表示节点,每个节点包含数据和指向下一个节点的指针。通过不断将节点连接起来,就形成了一个完整的链表结构。

使用结构体来表示链表的节点可以方便地操作链表,例如插入、删除和查找节点等操作。而使用结构体指针则可以更方便地操作节点的指针,例如改变节点的指向。


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


struct Node {
    int data;
    struct Node *next;
};

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


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


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表示访问第一个节点的数据。


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

相关文章
|
5天前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
15 1
|
2天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
13 7
|
11天前
|
C++
【C++系列】指针对象和对象指针的区别
这段内容介绍了C++中`ListNode`对象和指针的两种使用方式以及它们的区别。首先,`ListNode dummy(0); ListNode* cur = &dummy;创建了一个`ListNode`对象`dummy`在栈上,`cur`是`dummy`的地址。而`ListNode* dummy = new ListNode(0); ListNode* cur = dummy;`则在堆上分配了一个`ListNode`,`dummy`和`cur`都是指向该对象的指针。使用`&dummy`作为虚拟头节点简化链表操作,避免特殊处理。栈分配内存自动管理但生命周期受限,堆分配内存需手动释放且速度较慢。
|
12天前
|
存储 C语言
C语言数组指针和指针数组的区别及使用方法
C语言数组指针和指针数组的区别及使用方法
11 0
|
17天前
|
存储 C语言 索引
指向结构体数组的指针
指向结构体数组的指针
17 0
|
17天前
|
存储 C++
指向结构体变量的指针
指向结构体变量的指针
15 0
|
18天前
|
C++
结构体变量与结构体变量指针作为函数参数
结构体变量与结构体变量指针作为函数参数
11 0
|
19天前
|
存储 安全 编译器
使用unsafe库操作结构体的属性偏移和指针转换
【5月更文挑战第19天】Go语言是类型安全的,但通过`unsafe`包,可以进行结构体属性偏移量计算和指针转换。`unsafe.Offsetof`获取结构体字段的偏移量,`unsafe.Pointer`允许不同类型指针间的转换。然而,这可能导致类型安全屏障被绕过,若使用不当,会引发安全问题或panic。应谨慎使用`unsafe`,因为它不遵循GO 1兼容性准则。
24 0
使用unsafe库操作结构体的属性偏移和指针转换
|
20天前
|
C语言
指针(7)---*和&的区别
指针(7)---*和&的区别
3 0
|
25天前
|
存储 C语言 C++
结构体指针
结构体指针
24 1