IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> #结构体# -> 正文阅读

[数据结构与算法]#结构体#

目录

1 结构体类型和结构体变量

1.1 结构体类型的定义?

1.2 结构体变量的定义?

1.3 结构体变量的引用?

1.4 结构体变量的初始化?

2 结构体数组?

2.1 结构体数组的定义?

?2.2 结构体数组的引用

2.3 结构体数组的初始化?

?3 结构体指针

3.1 结构体指针变量的定义

3.2 结构体数组指针?

4 结构体类型数据在函数间的传递?

4.1 结构体变量作为函数参数?

4.2 结构体指针变量作为函数参数

4.3 结构体数组作为函数参数


?

1 结构体类型和结构体变量

1.1 结构体类型的定义?

? ? ? ? 结构体类型由不同类型的数据组成。struct是定义结构体类型的关键字,其后是所定义的结构体类型名,这两部分组成了结构体类型的标识符。在结构体类型名下面的大括号中定义组成该结构体的成员项,每个成员项由数据类型成员名组成。

定义一个名为Student的结构体类型如下:

struct Student
{
    long num;//学号
    char name[20];//姓名
    char sex;//性别
    int age;//年龄
    char addr[30];//住址
};//末尾分号不能丢

1.2 结构体变量的定义?

? ? ? ? ?当结构体类型定义之后,就可定义该结构体类型的变量,简称结构体变量。结构体变量的定义可以采用以下三种方法。

(1) 先定义结构体类型再定义结构体变量

struct Struct stu1, stu2;//可以省略struct不写

? ? ? ? 在定义stu1和stu2为struct Student类型的变量之后,它们就具有了Student类型的结构体特征,它们不是一个简单变量,而是由许多个数据成员组成的构造类型的变量。如下图所示。

(2) 再定义结构体类型的同时定义结构体变量?

struct Student
{
    long num;
    char name[20];
    char sex;
    int age;
    char addr[30];
}stu1, stu2;//注意分号的位置

(3) 直接定义结构体类型变量?

? ? ? ? 这种方法不需要定义结构体类型名,而是直接给出结构体类型并定义结构体变量。??

struct //此处不写类型名
{
    long num;
    char name[20];
    char sex;
    int age;
    char addr[30];
}stu1, stu2;
//该结构体无名(若程序中只需要使用少数个该结构变量,可以这样先定义好)

????????说明:?

? ? ? ? 1)结构体中的成员可以单独使用,它的作用和地位相当于普通变量。成员名也可以与程序中的变量名相同,但二者不代表同一对象,互不干扰。

? ? ? ? 2)C编译系统只对变量分配存储单元,不对类型分配存储单元。因此,在定义结构体类型时,不分配存储单元。

? ? ? ? 3)结构体成员也可以是一个结构体变量,即一个结构体的定义中可以嵌套另外一个结构体。例如:??

struct Date
{
    int year;
    int month;
    int day;
};
struct Student
{
    long num;
    char name[20];
    char sex;
    struct Date birthday;//birthday是struct Date类型
    char addr[30];
}stu3, stu4;

1.3 结构体变量的引用?

?????????在定义了结构体类型变量以后,就可以引用结构体类型变量,如赋值、存取和运算等。结构体变量的引用应遵循以下规则。?

? ? ? ? ?1)在程序中使用结构体变量时,不能将一个结构体变量作为一个整体进行处理。例如:printf("%ld, %s, %c, %d, %s", stu1);,这样是错误。应当通过对结构体变量的各个成员项的引用来实现各种运算和操作。引用结构体变量中一个成员的格式如下:

? ? ? ? 结构体变量名.成员名

? ? ? ? 这里的“.”是成员(分量)运算符,它在所有的运算符中优先级最高。例如,stu1.num表示引用结构体变量stu1中的num成员,可以对它赋值写成:stu1.num = 202103;?

? ? ? ? 2)如果结构体变量成员又是一个结构体类型,则访问一个成员时,应采用逐级访问的方法,即通过成员运算符逐级找到最底层的成员时再引用。例如,以上定义的stu3的成员中birthday又是一个结构体类型,若访问year成员,应写成stu3.birthday.year,而不能写成stu3.birthday。

? ? ? ? 3)结构体变量成员可以像普通变量一样进行各种运算。例如:

stu2.age = stu1.age = 20;
int sum += stu2.age;
stu1.age++;

?????????4)可以引用结构体成员地址结构体变量地址。例如:

//从键盘给stu1.num成员赋值
scanf("%ld", &stu1.num);

//输出stu1的首地址
printf("%p", &stu1);

//注意:不能使用以下方法给结构体成员提供值
scanf("%ld, %s, %c, %d, %s", &stu1);

1.4 结构体变量的初始化?

? ? ? ? 在定义结构体变量时可以同时对成员赋以初值,方法是通过将成员的初始值置于花括号内完成。例如:

struct Student
{
    long num;
    char name[20];
    char sex;
    char addr[30];
} s1 = {2021004, "Wang Ming", 'F', "Guizhou"};

2 结构体数组?

2.1 结构体数组的定义?

? ? ? ? 定义结构体数组的一般形式:

? ? ? ? struct 结构体类型名 结构体数组名[元素个数];?

? ? ? ? 结构体数组的定义方法与上节所述结构体变量的定义方法相同。例如:

struct Student
{
    long num;
    char name[20];
    float score;
} stu[30];

//注意:stu[i](i=0,1,...,29)的每一个数组元素都是struct Student类型变量

?????????其内存使用情况如下图所示。

?2.2 结构体数组的引用

? ? ? ? 结构体数组的引用是指对结构体数组元素的引用,由于每个结构体数组元素都是一个结构体变量,因此前面提到的关于引用结构体变量的方法也同样适用于结构体数组元素。

? ? ? ? 1)结构体数组元素中某一个成员的引用

stu[1].num; //引用stu第一个元素的num成员项
sum += stu[i].num; //对第i名同学的成绩累加
scanf("%ld %s %f", &stu[i].num, &stu[i].name, &stu[i].score,); //结构体数组元素用scanf函数提供初值

? ? ? ? 2)结构体数组元素的赋值?

? ? ? ? 可以将一个结构体数组元素赋给同一结构体数组中的另一个元素,或者赋给同一类型的变量。例如:stu[1] = stu[2]; stu[3] = stu[4];??

2.3 结构体数组的初始化?

? ? ? ? 结构体数组赋初值的方法与数组赋初值的方法相同,为了清晰起见,通常将成员的值依次放在一对花括号中,一遍区分各个元素。例如:

struct Student
{
    long num;
    char name[20];
    float score;
} stu[30] = { {2021001, "Zhang San", 62.5},
              {2021002, "Li Si", 91.5},
              ......
              {2021030, "Liu Ming", 87.0} };

?3 结构体指针

? ? ? ? 结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中, 那么,这个这个指针变量就指向该结构体变量。结构体指针变量的运算按照C语言的地址计算规则进行。

3.1 结构体指针变量的定义

? ? ? ? 结构体指针变量定义的一般形式:?struct 结构体类型 *结构体指针;?

? ? ? ? 例如:struct Student stu1, *p = &stu1;?其中定义了一个指向Student结构体类型的指针变量p,并将stu1的起始地址赋给指针变量p。通过下面例子说明结构体指针变量的应用。

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996);

struct Student
{
	long num;
	char name[20];
	int score;
};

int main()
{
	struct Student stu;
	struct Student* p = &stu;

	stu.num = 2021001;
	strcpy(stu.name, "ZhangSan");
	stu.score = 90;

	printf("%ld\t %s\t%d\n", stu.num, stu.name, stu.score);

	printf("%ld\t %s\t%d\n", (*p).num, (*p).name, (*p).score);

	printf("%ld\t %s\t%d\n", p->num, p->name, p->score);

	return 0;
}

? ? ? ? ?第一个printf函数中,用stu.num的形式访问成员变量;第二个printf中,用(*p).num的形式访问成员变量;第三个printf函数中,用p->num的形式访问成员变量。?为了方便直观,C语言中引入了一个指向运算符“->”,用于连接指针变量与其指向的结构体变量成员。

3.2 结构体数组指针?

? ? ? ? 一个指针变量可以指向结构体数组,即将结构体数组的起始地址赋给指针变量,这种指针就是结构数组指针。例如,以下语句定义了一个Student类型的结构体数组指针和指向该数组的指针变量:struct Student stu1[30], *p = stu1;,结构体数组指针的用法与一个指向int类型数组指针的用法一样,不再详述。

4 结构体类型数据在函数间的传递?

? ? ? ? 函数间不仅可以传递简单变量、数组、指针等类型的数据,也可以传递结构体类型的数据。函数之间结构体类型数据的传递和普通变量一样,可以按值传递,也可以按地址传递?

4.1 结构体变量作为函数参数?

?????????结构体变量的成员作为参数和结构体变量作为参数的用法同普通变量一样,属于按值传递方式。应当注意以下几点:

? ? ? ? 1)实参与形参的类型要保持一致。

? ? ? ? 2)调用函数的实参与被调用函数的形参都是结构体变量名。

? ? ? ? 3)形参和实参的结构类型相同,但运行时分配在不同的存储空间,因此,被调用函数不能修改调用函数实参的值

4.2 结构体指针变量作为函数参数

? ? ? ? 结构体指针变量存放的是结构体变量的首地址,所以结构体指针作为函数的参数,其实就是传递结构体变量的首地址,即按地址传递?。因此在函数调用过程中,实参和形参所指向的是同一组内存单元,被调用函数修改调用函数实参的值

4.3 结构体数组作为函数参数

? ? ? ? 函数间不仅可以传递一般的结构体变量,也可以传递结构体数组。在传递结构数组时,实参是数组名,即结构体数组的首地址;形参是指针,它接收传来的数组首地址,使它指向实参所表示的结构体数组,这种传递方式也是按地址传递

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:26:26  更:2021-09-26 10:27:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:53:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码