指针及其应用4——结构体指针

简介: 指针及其应用4——结构体指针

结构体指针的定义与使用

当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。 结构体指针变量的值是所指向的结构体变量的起始地址。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。

结构体指针变量定义的一般形式: 结构体名 *结构体指针变量名    

当然也可以在定义结构体的同时定义这个结构体指针变量。      

例如:(定义一个结构体(类型为自己定义的 student)指针变量 p)    

1. struct student{
2. char name[20];
3. char sex;
4. float score;
5.  } *p;

也可写成

1. struct student {
2. char name[20];
3. char sex;
4. float score;
5.  };
6. student *p;

与前面讨论的各类指针变量相同,结构体指针变量也必须要赋值后才能使用。

赋值是把结构体变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。

例如:如果 p 是被定义为 student 类型的结构体指针变量,boy 是被定义为 student 类型的结构体变量,则:p=&boy 是正确的,而 p=&student 是错误的。

 

引用结构体指针变量指向的结构体变量的成员的方法如下:
①、指针名->成员名
②、(*指针名).成员名    

例如: (*p).score 与 p->score 是等价的。

 

【例 14】结构体指针运用举例。

1. #include<cstdio>
2. using namespace std;
3. struct student {
4.  char name[20];
5.  char sex;
6.  int score;
7. } s[3]={{"xiaoming",'f',356},{"xiaoliang",'f',350},{"xiaohong",'m',0}};
8. int main()  
9. {
10.   student *p;
11.   printf("Name      Sex  Score\n");
12.   for (p=s; p<s+3; p++)
13.     printf("%-9s%3c%7d\n",p->name,p->sex,p->score);
14.   return 0;
15.  }

输出:

Name      Sex  Score

xiaoming   f     356

xiaoliang   f     350

xiaohong   m    0

【说明】 这里 p++起到移动指针的作用,随着 p 的变化,输出数组不同元素内容。

自引用结构

在一个结构体内部包含一个类型为该结构体本身的成员是否合法呢?

1. struct stu {
2. char name[20];  
3. int age,score;
4.     stu p;
5.   };

这种类型的自引用是非法的,因为成员 p 是另一个完整的结构,其内部还将包含它自己的成员 p。这第 2 个成员又是一个完整的结构,它还将包含自己的成员 p……这样重复下 去就永无止境了。这有点像永远不会终止的递归程序。

但下面这个程序是合法的:

1. struct stu {
2. char name[20];
3. int age,score;
4.     stu *p;
5.   };

这个声明和前面那个声明的区别在于 p 现在是一个指针而不是结构体。编译器在结构体的长度确定之前就已经知道指针的长度,所以这种类型的自引用是合法的。

当一个结构体中有一个或是多个成员是指针,它们所指向的类型就是本结构体类型时, 通常这种结构体称为“引用自身的结构体”,即“自引用结构”。这种自引用结构是实现其他一 些结构的基础。

自引用结构在动态数据结构中有重要作用,甚至可以说,自引用结构是 C/C++语言实 现动态数据结构的基石。包括动态的链表、堆、栈、树,无不是自引用结构的具体实现。    

例如,下面的定义就可以在实际操作中建立起一个链表。    

1. struct node {
2. int x,y;
3.     node *next; 
4.     } point;

 

相关文章
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
311 1
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1237 13
|
自然语言处理 前端开发 JavaScript
深入理解前端中的 “this” 指针:从基础概念到复杂应用
本文全面解析前端开发中“this”指针的运用,从基本概念入手,逐步探讨其在不同场景下的表现与应用技巧,帮助开发者深入理解并灵活掌握“this”的使用。
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
279 4
|
传感器 物联网 大数据
C 指针在物联网的应用
在物联网(IoT)中,C 语言及其指针功能广泛应用于嵌入式系统。C 指针在内存管理、设备驱动、数据结构处理、传感器通信等方面发挥关键作用,如动态分配内存、直接访问硬件寄存器、传递复杂数据结构等,有效提升了资源受限环境下的性能和灵活性。通过函数指针和省电模式管理,还能实现事件驱动编程和节能目标,使 C 语言成为 IoT 开发的重要工具。
216 13
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。