| |
|
开发:
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 结构体类型的定义?? ? ? ? 结构体类型由不同类型的数据组成。struct是定义结构体类型的关键字,其后是所定义的结构体类型名,这两部分组成了结构体类型的标识符。在结构体类型名下面的大括号中定义组成该结构体的成员项,每个成员项由数据类型和成员名组成。 定义一个名为Student的结构体类型如下:
1.2 结构体变量的定义?? ? ? ? ?当结构体类型定义之后,就可定义该结构体类型的变量,简称结构体变量。结构体变量的定义可以采用以下三种方法。 (1) 先定义结构体类型再定义结构体变量
? ? ? ? 在定义stu1和stu2为struct Student类型的变量之后,它们就具有了Student类型的结构体特征,它们不是一个简单变量,而是由许多个数据成员组成的构造类型的变量。如下图所示。 (2) 再定义结构体类型的同时定义结构体变量?
(3) 直接定义结构体类型变量? ? ? ? ? 这种方法不需要定义结构体类型名,而是直接给出结构体类型并定义结构体变量。??
????????说明:? ? ? ? ? 1)结构体中的成员可以单独使用,它的作用和地位相当于普通变量。成员名也可以与程序中的变量名相同,但二者不代表同一对象,互不干扰。 ? ? ? ? 2)C编译系统只对变量分配存储单元,不对类型分配存储单元。因此,在定义结构体类型时,不分配存储单元。 ? ? ? ? 3)结构体成员也可以是一个结构体变量,即一个结构体的定义中可以嵌套另外一个结构体。例如:??
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)结构体变量成员可以像普通变量一样进行各种运算。例如:
?????????4)可以引用结构体成员地址和结构体变量地址。例如:
1.4 结构体变量的初始化?? ? ? ? 在定义结构体变量时可以同时对成员赋以初值,方法是通过将成员的初始值置于花括号内完成。例如:
2 结构体数组?2.1 结构体数组的定义?? ? ? ? 定义结构体数组的一般形式: ? ? ? ? struct 结构体类型名 结构体数组名[元素个数];? ? ? ? ? 结构体数组的定义方法与上节所述结构体变量的定义方法相同。例如:
?????????其内存使用情况如下图所示。 ?2.2 结构体数组的引用? ? ? ? 结构体数组的引用是指对结构体数组元素的引用,由于每个结构体数组元素都是一个结构体变量,因此前面提到的关于引用结构体变量的方法也同样适用于结构体数组元素。 ? ? ? ? 1)结构体数组元素中某一个成员的引用
? ? ? ? 2)结构体数组元素的赋值? ? ? ? ? 可以将一个结构体数组元素赋给同一结构体数组中的另一个元素,或者赋给同一类型的变量。例如:stu[1] = stu[2]; stu[3] = stu[4];?? 2.3 结构体数组的初始化?? ? ? ? 结构体数组赋初值的方法与数组赋初值的方法相同,为了清晰起见,通常将成员的值依次放在一对花括号中,一遍区分各个元素。例如:
?3 结构体指针? ? ? ? 结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中, 那么,这个这个指针变量就指向该结构体变量。结构体指针变量的运算按照C语言的地址计算规则进行。 3.1 结构体指针变量的定义? ? ? ? 结构体指针变量定义的一般形式:?struct 结构体类型 *结构体指针;? ? ? ? ? 例如:struct Student stu1, *p = &stu1;?其中定义了一个指向Student结构体类型的指针变量p,并将stu1的起始地址赋给指针变量p。通过下面例子说明结构体指针变量的应用。
? ? ? ? ?第一个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 结构体数组作为函数参数? ? ? ? 函数间不仅可以传递一般的结构体变量,也可以传递结构体数组。在传递结构数组时,实参是数组名,即结构体数组的首地址;形参是指针,它接收传来的数组首地址,使它指向实参所表示的结构体数组,这种传递方式也是按地址传递。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |