结构体初始和嵌套

devtools/2024/11/15 0:39:21/

        1.介绍了各种基本类型(如整型、实型、字符型)、构造数据类型(如数组)和指针类型。但是,在解决一些较复杂的实际问题时,只使用这些数据类型是不够的。例如,在描述一本图书的信息时,图书编号、书名、专业领域、作者、出版社、单价等都是和图书相关的基本信息,这些信息是作为一个整体来描述图书的,如果将它们分别定义为互相独立的简单变量,则难以体现它们之间的内在联系。因此需要一种新的数据类型来描述图书,从而能够方便的保存和获取与图书相关的全部信息。为了解决这个问题,C语言提供了一种名为结构体(简称为结构)的数据类型。

        2.结构的概念及定义
        结构是将彼此相关的、类型不同的数据组合在一起的构造数据类型,它是由若干成员(也称为结构分量)组成的,每一个成员的数据类型可以是基本数据类型,也可以是构造类型。在使用某个结构之前必须先声明它,即根据需要构造它。声明结构类型的一般形式为:

struct 结构名
{类型名成员名1;类型名成员名2;
.....类型名成员名n;
}

说明(1)关键字struct 与结构名一起构成结构类型名。

        (2)大括号中的内容是结构所包括的成员。成员可以有多个,每一个的数据类型可以是基本类型,也可以是结构类型。结构名和成员名的命名应符合标识符的规定。成员名可以与程序中其它变量同名,互不干扰。
        (3)结构类型定义只是说明了结构类型的构成情况,即告诉系统该类型是由哪些类型的成员构成,各占多少个字节,系统并不分配内存空间,只有用结构类型定义了结构变量以后系统才会为结构变量分配内存空间。
        (4)定义结构类型时,不允许将成员的数据类型定义成自身的结构类型,这是因为结构类型的声明是构造阶段,系统还不知道需要分配多少内存空间。但是结构类型中可以含有指向自身类型的指针变量。
        (5)结构和数组的主要区别是:结构是数目固定、不同数据类型的有序数据的集合;而数组是数目固定、具有相同数据类型的有序数据的集合。可以将结构的成员定义为一个数组,同时,数组中的每个数组元素也可以是同一个结构类型。
        (6)C语言把结构声明看做是一条语句,括号后面的分号是不可少的。

        例 为了描述图书的信息,定义了一个结构类型为

struct books
{int bno;char bname[20];char field[10];char author[10];char publisher[30];float price;
};

        结构类型名为struct books,成员有 bno、bname[20]、field[10]、author[10]、publisher[30]和price。如果几个成员的数据类型相同,可以出现在一个类型定义中,成员名之间用逗号分隔,如上述结构类型的声明也可以用如下形式:
 

struct books
{int bno;char bname[20],field[10],author[10],publisher[30];float price ;}:

3. 结构的嵌套定义

方法一:先定义成员的结构类型,在定义主结构类型。

struct pubdate
{int year;int month;int day;
};
struct books
{int bno;char bname[20],field[10],author[10],publisher[30];
struct pubdate pdate;/*定义一个 struct pubdate 结构类型的成员 pdate */
float price ;
};

方法二:在主结构类型内部定义成员的结构类型对上述代码修改如下:

struct books
{int bno;char bname[20],field[10],author[10],publisher[30];struct pubdate
{int year;int month;int day;}pdate;
float price;
};

接下来举一个具体的实例。
 

#include <stdio.h>// 定义内部结构体
struct Address {char city[20];char street[30];int houseNumber;
};// 定义外部结构体,包含内部结构体作为成员
struct Person {char name[20];int age;struct Address addr;
};int main() {// 创建一个 Person 结构体变量并初始化struct Person person = {"Tom", 25, {"New York", "Main Street", 100}};// 输出结构体变量的内容printf("Name: %s\n", person.name);printf("Age: %d\n", person.age);printf("City: %s\n", person.addr.city);printf("Street: %s\n", person.addr.street);printf("House Number: %d\n", person.addr.houseNumber);return 0;
}

http://www.ppmy.cn/devtools/113148.html

相关文章

【 前端优化】Vue 3 性能优化技巧

Vue 3 性能优化技巧&#xff1a;让你的应用飞起来&#xff01; 大家好&#xff01;今天我想跟大家分享一些关于Vue 3性能优化的实用技巧。Vue 3带来了很多新的特性和改进&#xff0c;但只有了解并应用这些优化技巧&#xff0c;我们才能真正发挥它们的优势&#xff0c;打造更高…

Java企业面试题3

1. break和continue的作用(智*图) break&#xff1a;用于完全退出一个循环&#xff08;如 for, while&#xff09;或一个 switch 语句。当在循环体内遇到 break 语句时&#xff0c;程序会立即跳出当前循环体&#xff0c;继续执行循环之后的代码。continue&#xff1a;用于跳过…

《论软件需求管理》写作框架,软考高级系统架构设计师

论文真题 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互关联&#xff0c;初始需求导出的同时就要形成需求管理规划&#xff0c;一旦启动了软件开发过程&#xff0c;需求管理活动就紧密相伴。 需求管理过程中主要包含变更控制、版本控制、…

【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)

简介 PostgreSQL 是一个功能强大的开源对象关系数据库系统 下载地址 PostgreSQL: Downloads 由于我电脑上安装的是arcgispro3.1所以需要下载对应的postgresql版本 PostgreSQL 12 对应的 PostGIS 版本主要是 3.5.0 或更高版本。 安装 一般设置为postgresql 安装扩展插件 此…

Linux下的gcc与gdb

目录 Linux下的gcc与gdb 代码编译与链接 函数库 gdb介绍和安装 gdb基本使用指令 示例代码 debug模式和release模式 基本指令 进入gdb调试与显示调试代码 创建断点与删除断点 启用和禁用断点 执行代码 逐语句和逐过程调试 断点跳转 显示指定变量以及对应内容 打印变量的值 执行到…

《论负载均衡技术在Web系统中的应用》写作框架,软考高级系统架构设计师

论文真题 负载均衡技术是提升Web系统性能的重要方法。利用负载均衡技术&#xff0c; 可将负载(工作任务) 进行平衡、分摊到多个操作单元上执行&#xff0c; 从而协同完成工作任务&#xff0c; 达到提升Web系统性能的目的。 请围绕“负载均衡技术在Web系统中的应用”论题&…

C++比大小游戏

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <Windows.h> using namespace std; int main() {int ir 1;char chparr[2] { 0 };int ip1 0;int ip2 0;int i 1;c…

手势识别&手势控制系统-OpenCV&Python(源码和教程)

项目特点 手部手势识别&#xff1a; 项目利用计算机视觉技术来识别手部的各种手势。这种技术可以应用于多种场景&#xff0c;比如人机交互、游戏控制、无障碍技术等。 自定义手势&#xff1a; 用户可以自定义手势&#xff0c;这意味着可以通过训练新的手势模式来扩展系统的功能…