当前位置: 首页 > news >正文

C语言基础之结构体

        今天我们来讲讲C语言基础的最后一个知识点了 —— 结构体。不知道大家对前面的C语言基础的知识点掌握的怎么样了呢?下面我们就开始讲解结构体的相关知识点吧!

        什么是结构体呢?或者说结构体有什么作用呢?对于复杂对象来说,其不能通过内置类型来直接描述和表示,这时就有结构体来描述复杂类型。例如:如果我们想要描述学生的相关信息,包括学生的 名字 + 年龄 + 性别 + 学号 这几项信息,这时似乎通过我们之前所了解的变量、数组等类型并不能同时存储这些信息,那这时候采用结构体就能存储这些信息了。

1. 结构体类型的声明

在学习结构体的声明前,我们先来了解下面这几个词个概念:

        1. 结构:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
        2. 数组:一组相同类型元素的集合。
        3. 结构体:一组不一定相同类型元素的集合。

正因为结构体可以存储不同类型的元素,所以当我们想要存储复杂对象信息的时候,首先想到的便是结构体。那结构体该怎么声明呢?

结构体的声明:
struct tag
{
        member-list; 
}variable-list; 


其中,member-list 表示成员列表,可以是1个或多个;variable-list 表示结构体变量列表,也可以是1个或多个。


温馨提示:在结构体变量列表后的分号可不能丢了!!


当然,我们也可以用 typedef关键字 对结构体进行重命名,声明如下:
typedef struct tag
{
       member-list; 
}tag1,tag2; 


其中,tag1,tag2 是 struct tag 的别名,可以是1个或多个。

        学会了结构体的声明后,那么上述所谈到的学生信息就可以这样定义:

struct Stu
{
    char name[20];    // 名字
    int age;                // 年龄
    char sex[5];         // 性别
    char id[15];       // 学号
};

        而结构成员的类型可以是:变量、数组、指针、甚至是其他结构体。

2. 结构体初始化

        对于结构体的初始化,我们结合 代码 进行讲解。

#include<stdio.h>struct stu 
{char name[20];int age;char sex[10];  }s2,s3,s4; typedef struct stu1
{char name[20];int age;char sex[10];  // 男,女,保密}stu1;int main()
{struct stu s1 = { "zhangsan",18,"male" };stu1 s2 = { .age = 19, .name = "lisi", .sex = "female" };return 0;
}

        在上述代码中,我们采用两种方式定义了学生信息的结构体;其中stu1 是 struct stu1 的别名。这里先提醒大家:在C语言中,如果没有对结构体类型进行重命名(即没有使用 typedef 关键字),在初始化结构体时,struct关键字不能省略。(即如果没有重命名,则应该写 struct stu1 s2 而不是 stu1 s2)。

        在对结构体成员变量进行初始化时,同样有两种方法初始化:(分别如 s1 和 s2)。

                1. 如果我们想正常对结构体成员进行初始化,在初始化时要按照结构体中 成员的顺序在 {} 中依次对这些成员进行初始化,这样编译器在编译运行时才能对结构体成员的初始化一一对应。反之,如果不按顺序进行初始化,编译器则会报警告,如下图:

        对于结构体变量s3,由于 未按顺序进行初始化,则编译器发出警告!

        2. 那如果就是不想按顺序来对结构体成员进行初始化呢?当然可以不按顺序,此时初始化就如s2一样,通过 .结构体成员 的形式对想先初始化的成员进行初始化。

3. 结构体成员访问

        对结构体成员进行初始化之后,那我们又该如何对这些成员进行访问呢?即 我们如何访问 s 中的成员?对于结构体来说,其也是有结构体变量和指针的,因此有以下2种方法:

                1. 结构体变量访问成员:结构变量的成员是通过点操作符(.)访问的。点操作符接收两个操作数。(即 结构体变量.成员
                2. 结构体指针访问成员:结构指针的成员是通过操作符(->)访问的。操作符接收两个操作数。(即 结构体指针->成员

        代码如下:

#include<stdio.h>struct stu 
{char name[20];int age;char sex[10]; 
}; int main()
{//局部变量struct stu s1 = { "zhangsan",18,"male" };struct stu* ps = &s1;  // 结构体指针printf("%s %d %s\n", s1.name, s1.age, s1.sex);printf("%s %d %s\n", ps->name, ps->age, ps->sex);return 0;
}

4. 结构体传参

        我们先来看看 代码:

#include<stdio.h>struct S
{int data[10];int num;
};//结构体传参
void print1(struct S s)
{printf("%d\n", s.num);
}//结构体地址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}int main()
{struct S s = { {1,2,3,4,5,6}, 99 };print1(s);  // 传结构体print2(&s); //传地址return 0;
}

        在这段代码中,我们设置了两个输出函数 print1 和 print2;并通过不同的方式将 结构体变量s 传参给函数,代码都能正常运行并输出正确答案。

        那么各位老铁们觉得上面的 print1 和 print2 函数哪一个好些呢?答案是:优先选择print2函数。

        这是因为 在之前函数部分我们说过 形参是实参的一份临时拷贝当我们传递一个结构体对象给函数的时候,形参就会在内存中开辟一份和结构体内存一样大的空间。这时如果传递的结构体过大,那么形参开辟的临时空间也会很大,这样就会导致系统开销比较大,从而使得程序性能的下降。

        而如果我们传递的是结构体的地址时,这时形参就是一个指针,而指针要么 4字节大小,要么 8字节大小,并不会给操作系统的内存带来很大的压力,从而使得程序的性能较好!

        至此,我们C语言基础的全部知识就讲解完啦!老铁们有没有对C语言更加感兴趣呢?这里提前剧透一下,小编后面会给大家讲讲C语言进阶的相关知识了,后续的内容也需要更强的理解能力呀!大家敬请期待一下吧!!

相关文章:

C语言基础之结构体

今天我们来讲讲C语言基础的最后一个知识点了 —— 结构体。不知道大家对前面的C语言基础的知识点掌握的怎么样了呢&#xff1f;下面我们就开始讲解结构体的相关知识点吧&#xff01; 什么是结构体呢&#xff1f;或者说结构体有什么作用呢&#xff1f;对于复杂对象来说&#xff…...

Redis入门第四步:Redis发布与订阅

欢迎继续跟随《Redis新手指南&#xff1a;从入门到精通》专栏的步伐&#xff01;在本文中&#xff0c;我们将深入探讨Redis的发布与订阅&#xff08;Pub/Sub&#xff09;模式。这是一种强大的消息传递机制&#xff0c;适用于各种实时通信场景&#xff0c;如聊天应用、实时通知和…...

MySQL 之权限与授权

MySQL 权限及授权系统用于控制数据库用户对数据库资源的访问和操作权限。它提供了一种细粒度的安全控制机制&#xff0c;确保只有被授权的用户才能执行特定的操作。MySQL 的权限控制体系非常灵活&#xff0c;支持多种权限类型及级别&#xff08;数据库、表、列、存储过程等&…...

解决方案:Pandas里面的loc跟iloc,有什么区别

文章目录 一、现象二、解决方案案例使用loc使用iloc 简单总结 一、现象 在用Pandas库处理数据的时候&#xff0c;久而久之不用loc跟iloc&#xff0c;难免会有些混乱记混 二、解决方案 在Pandas中&#xff0c;loc和iloc是两种常用的数据选择方法&#xff0c;它们的主要区别在…...

C# 和 C++ 混合编程

以下是一个关于 C# 和 C 混合编程 的教程详细目录&#xff0c;涵盖了混合编程中的各个重要方面&#xff1a; 目录 1. 引言 1.1 什么是混合编程&#xff1f; 1.2 为什么选择 C# 和 C 进行混合编程&#xff1f; 1.3 应用场景和优势 2. 基本概念 2.1 C# 和 C 的基础差异 2.…...

Vxe UI vue vxe-table 实现表格单元格选中功能

Vxe UI vue vxe-table 实现表格单元格选中功能 在表格中实现鼠标点击任意单元格&#xff0c;选取的功能&#xff0c;通过 mouse-config 配置就可以开启单选功能&#xff0c;多选单元格选取功能需安装插件支持。 代码 参数说明 mouse-config 鼠标配置项&#xff1a; selected&…...

组合模式详解

1、组合模式基本介绍 1) 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;它创建了对象组的树形结构&#xff0c;将对象组合成树状结构以 表示“整体-部分”的层次关系。 2) 组合模式依据树形结构来组合对象&#xff0c;用来表示部…...

AltiumDesigner脚本开发-DIP封装制作

1.点击工具栏的运行工具(蓝色向右三角图标)可以执行脚本程序&#xff1b; 2.点击菜单栏Run->Run可以执行脚本程序&#xff1b; 3.在脚本编辑器中&#xff0c;按键盘的F9键可以执行脚本程序&#xff1b; 4.通过菜单栏执行脚本程序&#xff08;需要将程序添加到菜单栏中&am…...

乌班图基础设施安装之Mysql8.0+Redis6.X安装

简介&#xff1a;云服务器基础设施安装之 Mysql8.0Redis6.X 安装 Docker安装 # 按照依赖 yum install -y yum-utils device-mapper-persistent data lvm2 Docker Mirror 从去年开始. hub.docker.com[1] 在国内的访问速度极慢. 当时大家主要还是依赖国内的一些镜像源: 如中科…...

【动态规划-最长递增子序列(LIS)】力扣673.最长递增子序列的个数

给定一个未排序的整数数组 nums &#xff0c; 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列&#xff0c;分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。 示例 2: 输入: [2,2,2,2,2] 输出: 5 解释:…...

SQL优化 where谓词条件is null优化

1.创建测试表及谓词条件中包含is null模拟语句 create table t641 as select * from dba_objects; set autot trace select SUBOBJECT_NAME,OBJECT_NAME from t641 where OBJECT_NAMEWRI$_OPTSTAT_SYNOPSIS$ and SUBOBJECT_NAME is null; 2.全表扫描逻辑读1237 3.创建等值谓词条…...

Starrocks 元数据恢复 failed to load journal type 10242

fe 启动异常 2024-10-08 09:24:57.66908:00 INFO (stateChangeExecutor|87) [DatabaseTransactionMgr.replayUpsertTransactionState():1702] remove expired transaction: TransactionState. txn_id: 189324, label: delete_031c5090-7e2d-11ef-bdd8-000c29967e13, db id: 100…...

《深度学习》神经语言模型 Word2vec CBOW项目解析、npy/npz文件解析

目录 一、关于word2vec 1、什么是word2vec 2、常用训练算法 1&#xff09;CBOW 2&#xff09;SkipGram 二、关于npy、npz文件 1、npy文件 1&#xff09;定义 2&#xff09;特性 3&#xff09;用途 4&#xff09;保存及读取 运行结果&#xff1a; 运行结果&#xf…...

黄粱一梦,镜花水月总是空

总有人间一两风&#xff0c;埋我十万八千梦 自古以来&#xff0c;梦在我们的生活中一直是一个神秘玄幻而又发人深省的存在&#xff0c;我们一生中有三分之一的时间都在睡觉&#xff0c;做过的梦也是丰富多彩数不胜数。 而从科学的角度来说&#xff0c;梦是我们潜意识里的生活…...

【分布式事务-01】分布式事务之2pc两阶段提交

redis系列整体栏目 内容链接地址【一】分布式事务之2pc两阶段提交https://zhenghuisheng.blog.csdn.net/article/details/142406325 分布式事务之2pc两阶段提交 一&#xff0c;分布式事务之2pc两阶段提交1&#xff0c;两阶段提交(2pc)2&#xff0c;2pc两阶段提交实现思路3&…...

docker 安装 rabbitMQ

第一步&#xff1a;准备工作 # 打开docker目录 [rootMuYu ~]# cd /usr/local/docker/ # 创建rabbitmq文件夹 [rootMuYu docker]# mkdir rabbitmq # 打开rabbitmq文件夹 [rootMuYu docker]# cd rabbitmq/ # 创建挂载目录 [rootMuYu rabbitmq]# mkdir data 第二步&#xff…...

知识改变命运 数据结构【java对象的比较】

0&#xff1a;前言 在基本数据类型中&#xff0c;我们可以直接使用号比较是否相等&#xff0c;还记的学堆哪里时候&#xff0c;插入一个数据&#xff0c;就会与其他数据进行比较&#xff0c;当时我们传入的是Integer类型&#xff0c;在Integer类里面已经实现了compare。 如果…...

01_23 种设计模式之《简单工厂模式》

文章目录 一、什么是设计模式二、设计模式类型简单工厂模式及应用场景定义抽象产品类和具体产品类实现工厂类客户端代码注意事项 一、什么是设计模式 设计模式&#xff1a;在软件研发过程中&#xff0c;经过实战验证&#xff0c;用于解决在特定环境下、重复出现的&#xff0c;…...

Android 12.0 关于定制自适应AdaptiveIconDrawable类型的动态日历图标的功能实现系列一

1.前言 在12.0的系统rom定制化开发中,在关于定制动态日历图标中,原系统是不支持动态日历图标的功能,所以就需要从新 定制动态时钟图标关于自适应AdaptiveIconDrawable类型的样式,就是可以支持当改变系统图标样式变化时,动态日历 图标的背景图形也跟着改变,所以接下来就来…...

【源码+文档+调试讲解】基于安卓的小餐桌管理系统springboot框架

摘 要 相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低运营人员成本&#xff0c;实现了小餐桌的标准化、制度化、程序化的管理&#xff0c;有效地防止了小餐桌的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确地查询和修…...

C语言中的文件操作(二)

C语言中的文件操作&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/Xiaodao12345djs/article/details/142746010?spm1001.2014.3001.5501 四、文件的顺序读写 1、fputc (字符输出函数/写) 将一个字符写入文件中 #include <stdio.h>int main() {FILE* pf fo…...

【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则

文章目录 C 继承详解&#xff1a;初阶理解与实战应用前言第一章&#xff1a;继承的基本概念与定义1.1 继承的概念1.2 继承的定义 第二章&#xff1a;继承中的访问权限2.1 基类成员在派生类中的访问权限2.2 基类与派生类对象的赋值转换2.2.1 派生类对象赋值给基类对象2.2.2 基类…...

Ubuntu 22.04 安装 KVM

首先检查是否支持 CPU 虚拟化&#xff0c;现在的 CPU 都应该支持&#xff0c;运行下面的命令&#xff0c;大于0 就是支持。 egrep -c (vmx|svm) /proc/cpuinfo安装 Libvirt apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-uti…...

101 公司战略的基本概念

公司战略的概念 传统概念&#xff08;战略是终点途径&#xff09;&#xff1a;计划性、全局性、长期性现代概念&#xff08;战略是途径&#xff09;&#xff1a;应变性、竞争性、风险性综合概念&#xff08;前二者的折中&#xff09;&#xff1a;预先性、反应性公司的使命与目标…...

【devops】devops-ansible之剧本初出茅庐--搭建rsync和nfs

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》从问题中去学习k8s 《docker学习》暂未更…...

@RestController 和 @Controller 注解的联系及要点

1. RestController • RestController 是 Spring 4.0 引入的一个注解&#xff0c;它相当于 Controller ResponseBody组合注解。 主要作用&#xff1a;主要用于构建 RESTful Web 服务。标注 RestController 的类里的所有方法&#xff0c;返回的都是 JSON 或 XML 等格式的数据…...

机器学习篇-day03-线性回归-正规方程与梯度下降-模型评估-正则化解决模型拟合问题

一. 线性回归简介 定义 线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 回归方程(函数) 一元线性回归: y kx b > wx b k: 斜率, 在机器学习中叫 权重(weight), 简称: w b: 截距, 在机…...

图像人脸与视频人脸匹配度检测

import cv2 import dlib import numpy as np import os from pathlib import Path# 加载预训练模型 face_recognition_model "dlib_face_recognition_resnet_model_v1.dat" face_recognition_net dlib.face_recognition_model_v1(face_recognition_model)detector …...

【AI绘画】Midjourney进阶:对称构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;对称构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 通常来学习AI绘画的人可以分为…...

道路积水检测数据集 1450张 路面积水 带分割 voc yolo

道路积水检测数据集 1450张 路面积水 带分割 voc yolo 分类名: (图片张数&#xff0c; 标注个数) puddle:(1468,1994) 总数:(1468&#xff0c;1994) 总类(nc): 1类 道路积水检测数据集介绍 项目名称 道路积水检测数据集 项目概述 本数据集包含1450张带有标注的图像&#x…...