结构体初始和嵌套

devtools/2024/9/19 16:43:28/ 标签: c语言

        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;这意味着可以通过训练新的手势模式来扩展系统的功能…

Mybatis-plus-Generator 3.5.5 自定义模板支持 (DTO/VO 等) 配置

随着项目节奏越来越快&#xff0c;为了减少把时间浪费在新建DTO 、VO 等地方&#xff0c;直接直接基于Mybatis-plus 这颗大树稍微扩展一下&#xff0c;在原来生成PO、 DAO、Service、ServiceImpl、Controller 基础新增。为了解决这个问题&#xff0c;网上找了一堆资料&#xff…

【加密社】Solidity 中的事件机制及其应用

加密社 引言 在Solidity合约开发过程中&#xff0c;事件&#xff08;Events&#xff09;是一种非常重要的机制。它们不仅能够让开发者记录智能合约的重要状态变更&#xff0c;还能够让外部系统&#xff08;如前端应用&#xff09;监听这些状态的变化。 本文将详细介绍Solidity中…

数据中台建设(六)—— 数据资产管理

数据资产管理 随着企业数据越来越大&#xff0c;企业意识到数据是一种无形的资产&#xff0c;通过对企业各业务线产生的海量数据进行合理管理和有效应用&#xff0c;能盘活并充分释放数据的巨大价值。如果不能对海量数据进行有效管理和应用&#xff0c;企业堆积如山的数据给企…

day20JS-axios数据通信

1. 什么是axios axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;简单的理解就是ajax的封装&#xff0c;只不过它是Promise的实现版本。 特性&#xff1a; 从浏览器中创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请求和响应转…

初学Linux(学习笔记)

初学Linux&#xff08;学习笔记&#xff09; 前言 本文跳过了Linux前期的环境准备&#xff0c;直接从知识点和指令开始。 知识点&#xff1a; 1.目录文件夹&#xff08;Windows&#xff09; 2.文件内容属性 3.在Windows当中区分文件类型是通过后缀&#xff0c;而Linux是通过…

Java项目: 基于SpringBoot+mybatis+maven校园资料分享平台(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven校园资料分享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

Unity程序基础框架

概述 单例模式基类 没有继承 MonoBehaviour 继承了 MonoBehaviour 的两种单例模式的写法 缓存池模块 &#xff08;确实挺有用&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 缓存池模块 /// 知识点 //…

Qt 基础按钮布局管理

cpp public: Content(QWidget *parent0); ~Content(); QStackedWidget *stack; QPushButton *AmendBtn; QPushButton *CloseBtn; Baseinfo *baseInfo; Contact *contact; Detail *detail; // 打开 "Content.cpp" 文件&#xff0c;添加如下代码&#xff1a; Content:…

RabbitMQ(高阶使用)死信队列

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 一、什么是死信队列&#xff1f; 二、死信队列使用场景 三、死信队列如何使用 四、打车超时处理 1.打车超时实现 以下是本篇文章正文内容 一、什么是死信队列&#xff1f; 先从概念解释上搞…

python教程(二):python数据结构大全(附代码)

Python 中数据结构的重要性不言而喻&#xff0c;它们是构建高效、可维护代码的基础。数据结构决定了如何存储、组织和操作数据。理解和使用合适的数据结构能够极大地提升程序的性能、简洁性以及代码的可读性。 Python 的基础数据结构有 4 种&#xff0c;分别是 列表 (list)、元…

Gateway学习笔记

目录 介绍&#xff1a; 核心概念 依赖 路由 断言 基本的断言工厂 自定义断言 过滤器 路由过滤器 过滤器工厂 自定义路由过滤器 全局过滤器 其他 过滤器执行顺序 前置后置&#xff08;&#xff1f;&#xff09; 跨域问题 yaml 解决 配置类解决 介绍&#x…

tcp线程进程多并发

tcp线程多并发 #include<myhead.h> #define SERPORT 8888 #define SERIP "192.168.0.118" #define BACKLOG 20 typedef struct { int newfd; struct sockaddr_in cin; }BMH; void *fun1(void *sss) { int newfdaccept((BMH *)sss)->newfd; …