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

C语言中的结构体,指针,联合体的使用

目录

  • 1. 概述
  • 2. 定义和初始化
  • 3. 成员的使用
  • 4. 结构体数组
  • 5. 结构体套结构体
  • 6. 结构体赋值
  • 7. 结构体和指针
  • 8. 结构体作为函数参数
  • 9. 共用体(联合体)
  • 10. typedef就是取别名
  • 总结

1. 概述

数组:连续的相同数据类型的集合
结构体:不同数据类型的集合

2. 定义和初始化

  • 先声明结构体类型再定义变量名
  • 在声明类型的同时定义变量
  • 直接定义结果体类型变量(无类型名)
  1. 定义结构体类型,再使用该类型定义变量
struct stu {char name[20];int age;
};
struct stu s1 = { "lily", 20 };
  1. 定义结构体类型同时定义变量
struct stu2 {char name[20];int age;
} s2 = { "lily", 20 };
  1. 定义结构体变量,不定义类型
struct{char name[20];int age;
} s3 = { "lily", 20 };

3. 成员的使用

  1. 结构体.成员
  2. 结构体->成员
# include<stdio.h>
struct stu {char name[20];int age;
};int main() {struct stu s1 = { "lily", 20 };// 1. 通过点运算符访问s1变量的成员printf("名字是:%s\n", s1.name);// 修改strcpy(s1.name, "Jorry");printf("名字是:%s\n", s1.name);// 2. 通过->运算符访问结构体指针变量p的成员printf("(&s1)->name = %s, (&s1)-> age = %d\n", (&s1)->name, (&s1)->age);return 0;
}

4. 结构体数组

# include<stdio.h>
struct stu {char name[20];int age;
};int main() {struct stu s1[5] = { {"lily", 24 },{"lidaly", 205 },{"lidaly", 203 },{"lilsady", 230 },{"lily2", 22 } };for (int i = 0; i < 5; i++) {printf("输出%d个:---------\n", i);printf("名字是:%s, 年龄: %d\n", s1[i].name, s1[i].age);printf("名字是:%s, 年龄: %d\n", (*(s1+i)).name, s1[i].age);printf("名字是:%s, 年龄: %d\n", (s1 + i)->name, s1[i].age);}printf("-----------");return 0;
}

5. 结构体套结构体

# include<stdio.h>
struct stu {char name[20];int age;
};
struct teacher {int age;struct stu s;
};
int main() {// 这样子写也可以// struct teacher t[2] = { 40, "张三", 18, 42, "李四", 28};struct teacher t[2] = {{40, {"张三", 18}},{42, {"李四", 28}}};int i = 0;for (i = 0; i < 2; i++) {printf("老师[%d]的年龄: %d,学生名字:%s, 学生年龄: %d\n", i, t[i].age, t[i].s.name, t[i].s.age);}return 0;
}

6. 结构体赋值

// 有警告
#define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
#include <string.h>
#include <stdlib.h>
struct stu {char name[20];int age;
};
int main() {struct stu s;strcpy(s.name, "rose");s.age = 18;printf("名字是:%s, 年龄: %d\n", s.name, s.age);// 结构体赋值struct stu s2 = s;// 和拷贝一样memcpy(&s2, &s1, sizeof(s1))printf("名字是:%s, 年龄: %d\n", s2.name, s2.age);// 这是两个变量,可以输出地址查看printf("s的地址: %d, s2的地址: %d", &s, &s2);return 0;
}

7. 结构体和指针

  1. 普通结构体指针
  2. 指向堆区空间的结构体指针
  3. 结构体中套指针
#define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
#include <string.h>
#include <stdlib.h>
struct stu {char name[20];int age;
};
struct stu2 {char* name;int age;
};
int main() {// 1. 普通结构体指针struct stu s = { "milk", 23 };struct stu* p = &s;printf("1. \n");printf("名字是:%s, 年龄: %d\n", p->name, p->age);printf("名字是:%s, 年龄: %d\n", (*p).name, (*p).age);// 2. 指向堆区空间的结构体指针struct stu* p2 = (struct stu *)malloc(sizeof(struct stu));strcpy(p2->name, "rose9");p2->age = 27;printf("2. \n");printf("名字是:%s, 年龄: %d\n", p2->name, p2->age);printf("名字是:%s, 年龄: %d\n", (*p2).name, (*p2).age);// 3. 结构体中套指针struct stu2* p3 = (struct stu2*)malloc(sizeof(struct stu2));p3->name = (char*)malloc(strlen("jack") + 1);strcpy(p3->name, "rose");p3->age = 29;printf("3. \n");printf("名字是:%s, 年龄: %d\n", p3->name, p3->age);printf("名字是:%s, 年龄: %d\n", (*p3).name, (*p3).age);if (p3->name != NULL) {free(p3->name);p3->name = NULL;}if (p3 != NULL) {free(p3);p3 = NULL;}return 0;
}

8. 结构体作为函数参数

  1. 作为普通变量做函数参数
  2. 指针变量做函数参数
#define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
#include <string.h>
#include <stdlib.h>
void foo(struct stu tmp) {printf("名字是:%s, 年龄: %d\n", tmp.name, tmp.age);strcpy(tmp.name, "milk");printf("名字是:%s, 年龄: %d\n", tmp.name, tmp.age);
}void foo2(struct stu* tmp) {printf("名字是:%s, 年龄: %d\n", tmp->name, tmp->age);strcpy(tmp->name, "rose");tmp->age = 27;printf("名字是:%s, 年龄: %d\n", tmp->name, tmp->age);
}int main() {struct stu s = { "lily", 20 };foo(s);printf("名字是:%s, 年龄: %d\n", s.name, s.age);foo2(&s);printf("名字是:%s, 年龄: %d\n", s.name, s.age);return 0;
}

输出结果:

名字是:lily, 年龄: 20
名字是:milk, 年龄: 20
名字是:lily, 年龄: 20
名字是:lily, 年龄: 20
名字是:rose, 年龄: 27
名字是:rose, 年龄: 27

9. 共用体(联合体)

联合union是一个能在同一个存储空间存储不同类型数据的类型
联合体所占的内存长度等于其最长成员的长度倍数,也有叫做共用体

# include<stdio.h>
#include <string.h>
#include <stdlib.h>
struct stu {char name[20];int age;
};
union test {unsigned char a;unsigned int b;unsigned short c;};
int main() {union test tmp;// 1. 共用体中元素地址是一样的printf("&(tmp.a) = %p, &(tmp.b) = %p, &(tmp.c) = %p\n", &(tmp.a), &(tmp.b), &(tmp.c));//2. 共用体变量大小是最大元素大小pritf("sizeof(tmp) = %d\n", sizeof(tmp));// 3. 给其中一个赋值,会影响其他元素tmp.b = 0x44332211;printf("tmp.a = %x, tmp.b = %x, tmp.c = %x\n", tmp.a, tmp.b, tmp.c);tmp.a = 0x00;printf("tmp.a = %x, tmp.b = %x, tmp.c = %x\n", tmp.a, tmp.b, tmp.c);return 0;
}

输出结果:

&(tmp.a) = 000000378D8FF574, &(tmp.b) = 000000378D8FF574, &(tmp.c) = 000000378D8FF574
sizeof(tmp) = 4
tmp.a = 11, tmp.b = 44332211, tmp.c = 2211
tmp.a = 0, tmp.b = 44332200, tmp.c = 2200

10. typedef就是取别名

#define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
#include <string.h>
#include <stdlib.h>
#define TRUE 1
typedef struct test {int a;char b;short c;
}TEST, *PTEST;
int main() {printf("TRUE = %d\n", TRUE);TEST t1;t1.a = 10;t1.b = 'b';t1.c = 40;PTEST p = &t1;printf("p->a = %d, p->b = %c, p->c = %d\n", p->a, p->b, p->c);return 0;
}

输出结果:

TRUE = 1
p->a = 10, p->b = b, p->c = 40
typedef struct test {int a;char b;short c;
}*PTEST;
//相当于
typedef struct test {int a;char b;short c;
}* PTEST;
//给struct test {
//	int a;
//	char b;
//	short c;
//}*起名为PTEST

总结

结构体在 C 语言中非常有用,它可以帮助你更有效地组织和管理复杂的数据结构,适用于很多实际的编程场景,如数据库编程、图形编程等领域。
这部分很基础,也很有意思,后面的话,我考虑使用结构体进行一些操作,发一些博客。
这边博客仅仅是基础的使用,后面会尽量细一些,丰富一些。

相关文章:

C语言中的结构体,指针,联合体的使用

目录 1. 概述2. 定义和初始化3. 成员的使用4. 结构体数组5. 结构体套结构体6. 结构体赋值7. 结构体和指针8. 结构体作为函数参数9. 共用体&#xff08;联合体&#xff09;10. typedef就是取别名总结 1. 概述 数组&#xff1a;连续的相同数据类型的集合 结构体&#xff1a;不同…...

基于卡尔曼滤波器的 PID 控制

基于卡尔曼滤波器的PID控制算法结合了经典控制理论和现代信号处理技术。卡尔曼滤波器&#xff08;Kalman Filter, KF&#xff09;可以对噪声数据进行平滑处理&#xff0c;从而改善PID控制器的性能&#xff0c;特别是在处理具有噪声和不确定性的系统时。以下是详细的设计过程&am…...

CVE-2022-26201

打开是这么个页面 左上角找到Admin访问 里面有个Add Users&#xff0c;访问一下&#xff0c;能创建用户&#xff0c;有个能上传图片的地方 普通的一句话木马无法访问flag&#xff0c;需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…...

海信Java后端开发面试题及参考答案

TCP 的优点是什么? TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它具有众多优点。 首先,TCP 提供可靠的传输服务。它通过序列号、确认应答、重传机制等确保数据的准确无误传输。例如,在发送数据时,发送方会…...

传智杯 3-初赛:终端

题目描述&#xff1a; 有一天您厌烦了电脑上又丑又没用的终端&#xff0c;打算自己实现一个 Terminal。具体来说&#xff0c;它需要支持如下命令: 1. touch filename&#xff1a;如果名为 filename 的文件不存在&#xff0c;就创建一个这样的文件&#xff0c;如果已经存在同名…...

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【中间件】Redis

一、什么是Redis Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合&#xff0c;位图&#xff0c;hyperloglogs等数据类型。内置…...

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…...

Java爬虫:获取商品详情的实践之旅

在当今这个信息爆炸的时代&#xff0c;数据的价值日益凸显。对于电商行业来说&#xff0c;商品详情的获取尤为重要&#xff0c;它不仅关系到产品的销售&#xff0c;还直接影响到用户体验。传统的人工获取方式耗时耗力&#xff0c;而自动化的爬虫技术则提供了一种高效解决方案。…...

行业分析---2024年小鹏汽车AI Day及三季度财报

1 背景 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…...

写时复制,读时加载

实现写时复制&#xff0c;读时加载&#xff0c;原理为&#xff0c;申请内存时&#xff0c;只给一段线性地址空间&#xff0c;并不分配物理内存&#xff0c;当cpu读、写该内存时&#xff0c;发生缺页中&#xff0c;或者写错误&#xff0c;中断处理程序根据前面设置的内容&#x…...

Python和R基因组及蛋白质组学和代谢组学

&#x1f335;Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大&#xff0c;且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…...

selenium环境搭建详细过程

一、准备工作 在开始搭建 Selenium 环境之前&#xff0c;确保具备以下条件&#xff1a; 1.稳定的网络连接&#xff1a; 以便能够下载所需的软件和驱动程序。 2.操作系统基础&#xff1a; 对您的操作系统&#xff08;如 Windows、Mac 或 Linux&#xff09;有基本的了解和操…...

Linux知识 - VIM

VI于VIM linux系统里边内置了一个编辑器就叫做vi&#xff08;visual editor&#xff09;&#xff0c;但vi的功能非常有限&#xff0c;所以一般Linux的使用人员会选择一个比vi更强大的编辑器vim Vim的三种工作模式 输入模式 在正常模式中按下别字母键&#xff0c;会进入插入模式…...

【数据结构】链表重难点突破

目录 一、链表的概念 二、链表的实现 2.1 链表的构建 2.2 从链表头部添加元素 2.3 从链表尾部添加元素 2.4 链表任意位置添加元素 2.5 常规方法实现 2.6 获取指定位置的元素 2.7 获取指定元素的位置 2.8 修改链表中某一节点 2.9 删除链表的头结点 2.10 删除链表的尾…...

大宗商品行业区块链应用

应用场景 区块链技术具有透明性、去中心化、不可篡改等特点&#xff0c;因此可以在大宗商品定价方面得到应用。通过区块链技术&#xff0c;相关交易的各方可以在无需依赖中心化第三方的情况下&#xff0c;实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...

Varjo:垂直起降机混合现实培训解决方案

混合电动垂直起降机&#xff08;VTOL&#xff09;作为一种新型的航空运输机具有超越传统汽车的安全性、与飞机相当的速度以及无与伦比的灵活起降功能。电动垂直起降机能够在建筑顶部、直升机场或是没有跑道的地区起飞或降落&#xff0c;且排放要远远低于由航空汽油驱动的传统飞…...

sqlite-vec一个SQLite3高效向量搜索扩展--JDBC环境使用

最近要用SQLite3&#xff0c;之前放出来了SQLiteUtile工具&#xff0c;方便操作。今天发现AIGC方面&#xff0c;RAG知识库需要使用向量数据库&#xff0c;来存储知识信息。一般呢都是用mysql&#xff0c;但无奈的是mysql就是不让用。突然又发现SQLite3有向量库扩展组件&#xf…...

10 基于深度学习的目标检测

首次完成时间&#xff1a;2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1&#xff09;程序代码&#xff1a; import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …...

leetcode top100中的30道递归和贪心

21到30题&#xff0c;递归和贪心...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...