C语言中的结构体,指针,联合体的使用
目录
- 1. 概述
- 2. 定义和初始化
- 3. 成员的使用
- 4. 结构体数组
- 5. 结构体套结构体
- 6. 结构体赋值
- 7. 结构体和指针
- 8. 结构体作为函数参数
- 9. 共用体(联合体)
- 10. typedef就是取别名
- 总结
1. 概述
数组:连续的相同数据类型的集合
结构体:不同数据类型的集合
2. 定义和初始化
- 先声明结构体类型再定义变量名
- 在声明类型的同时定义变量
- 直接定义结果体类型变量(无类型名)
- 定义结构体类型,再使用该类型定义变量
struct stu {char name[20];int age;
};
struct stu s1 = { "lily", 20 };
- 定义结构体类型同时定义变量
struct stu2 {char name[20];int age;
} s2 = { "lily", 20 };
- 定义结构体变量,不定义类型
struct{char name[20];int age;
} s3 = { "lily", 20 };
3. 成员的使用
- 结构体.成员
- 结构体->成员
# 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. 结构体和指针
- 普通结构体指针
- 指向堆区空间的结构体指针
- 结构体中套指针
#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. 结构体作为函数参数
- 作为普通变量做函数参数
- 指针变量做函数参数
#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. 共用体(联合体)10. typedef就是取别名总结 1. 概述 数组:连续的相同数据类型的集合 结构体:不同…...
基于卡尔曼滤波器的 PID 控制
基于卡尔曼滤波器的PID控制算法结合了经典控制理论和现代信号处理技术。卡尔曼滤波器(Kalman Filter, KF)可以对噪声数据进行平滑处理,从而改善PID控制器的性能,特别是在处理具有噪声和不确定性的系统时。以下是详细的设计过程&am…...
CVE-2022-26201
打开是这么个页面 左上角找到Admin访问 里面有个Add Users,访问一下,能创建用户,有个能上传图片的地方 普通的一句话木马无法访问flag,需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…...
海信Java后端开发面试题及参考答案
TCP 的优点是什么? TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它具有众多优点。 首先,TCP 提供可靠的传输服务。它通过序列号、确认应答、重传机制等确保数据的准确无误传输。例如,在发送数据时,发送方会…...
传智杯 3-初赛:终端
题目描述: 有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal。具体来说,它需要支持如下命令: 1. touch filename:如果名为 filename 的文件不存在,就创建一个这样的文件,如果已经存在同名…...
大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
【中间件】Redis
一、什么是Redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置…...
RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果
流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展,流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言,把握这些趋势并积极应对挑战将是实现成功的关键…...
Java爬虫:获取商品详情的实践之旅
在当今这个信息爆炸的时代,数据的价值日益凸显。对于电商行业来说,商品详情的获取尤为重要,它不仅关系到产品的销售,还直接影响到用户体验。传统的人工获取方式耗时耗力,而自动化的爬虫技术则提供了一种高效解决方案。…...
行业分析---2024年小鹏汽车AI Day及三季度财报
1 背景 在之前的博客中,笔者撰写了多篇行业类分析的文章(科技新能源): 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…...
写时复制,读时加载
实现写时复制,读时加载,原理为,申请内存时,只给一段线性地址空间,并不分配物理内存,当cpu读、写该内存时,发生缺页中,或者写错误,中断处理程序根据前面设置的内容&#x…...
Python和R基因组及蛋白质组学和代谢组学
🌵Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大,且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…...
selenium环境搭建详细过程
一、准备工作 在开始搭建 Selenium 环境之前,确保具备以下条件: 1.稳定的网络连接: 以便能够下载所需的软件和驱动程序。 2.操作系统基础: 对您的操作系统(如 Windows、Mac 或 Linux)有基本的了解和操…...
Linux知识 - VIM
VI于VIM linux系统里边内置了一个编辑器就叫做vi(visual editor),但vi的功能非常有限,所以一般Linux的使用人员会选择一个比vi更强大的编辑器vim Vim的三种工作模式 输入模式 在正常模式中按下别字母键,会进入插入模式…...
【数据结构】链表重难点突破
目录 一、链表的概念 二、链表的实现 2.1 链表的构建 2.2 从链表头部添加元素 2.3 从链表尾部添加元素 2.4 链表任意位置添加元素 2.5 常规方法实现 2.6 获取指定位置的元素 2.7 获取指定元素的位置 2.8 修改链表中某一节点 2.9 删除链表的头结点 2.10 删除链表的尾…...
大宗商品行业区块链应用
应用场景 区块链技术具有透明性、去中心化、不可篡改等特点,因此可以在大宗商品定价方面得到应用。通过区块链技术,相关交易的各方可以在无需依赖中心化第三方的情况下,实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...
Varjo:垂直起降机混合现实培训解决方案
混合电动垂直起降机(VTOL)作为一种新型的航空运输机具有超越传统汽车的安全性、与飞机相当的速度以及无与伦比的灵活起降功能。电动垂直起降机能够在建筑顶部、直升机场或是没有跑道的地区起飞或降落,且排放要远远低于由航空汽油驱动的传统飞…...
sqlite-vec一个SQLite3高效向量搜索扩展--JDBC环境使用
最近要用SQLite3,之前放出来了SQLiteUtile工具,方便操作。今天发现AIGC方面,RAG知识库需要使用向量数据库,来存储知识信息。一般呢都是用mysql,但无奈的是mysql就是不让用。突然又发现SQLite3有向量库扩展组件…...
10 基于深度学习的目标检测
首次完成时间:2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1)程序代码: import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …...
leetcode top100中的30道递归和贪心
21到30题,递归和贪心...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
