C语言结构体与公用体

2024-04-18 02:28
文章标签 语言 结构 公用

本文主要是介绍C语言结构体与公用体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结构体

   概述

  • 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性
  • 这时候可通过结构体实现
  • 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”

可以理解为其他语言的object类型 

结构体变量的定义和初始化

  • 定义结构体变量的方式:
  • 先声明结构体类型再定义变量名
  • 在声明类型的同时定义变量       

语法格式:

// 先声明结构体类型再定义变量名
struct 结构体名 {成员列表
};
struct 结构体名 变量名;// 在声明类型的同时定义变量
struct 结构体名 {成员列表
}变量名;

 基本使用

#include <stdio.h>// 定义结构体
struct student
{/* data */char name[20];int age;
};int main()
{// 赋值struct student stu = {"llh", 22};// 使用printf("%s,%d", stu.name, stu.age);
}

 数组嵌套使用

#include <stdio.h>// 定义结构体
struct student
{/* data */char name[20];int age;
};int main()
{struct student stuList[100] = {{"llh", 22}, {"llm", 25}};// 计算已初始化元素的数量for (int i = 0; i < 2; i++){/* code */printf("%s,%d\n",stuList[i].name,stuList[i].age);}
}

 结构体值传参 

  传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};// 函数定义
void func(struct stu temp) {strcpy(temp.name, "yoyo");temp.age = 20;printf("函数内部:%s, %d\n", temp.name, temp.age);
}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,值传递func(s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);return 0;
}

 结果:

函数内部:yoyo, 20
函数外部:mike, 18

结构体地址传递

  • 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

示例代码:

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};// 函数定义
void func(struct stu *p) {strcpy(p->name, "yoyo");p->age = 20;printf("函数内部:%s, %d\n", p->name, p->age);
}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,地址传递func(&s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);return 0;
}

共用体

  • 共用体union是一个能在同一个存储空间存储不同类型数据的类型
  • 共用体所占的内存长度等于其最长成员的长度,也有叫做共用体
  • 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用
  • 共用体变量中起作用的成员是最后一次存放的成员在,存入一个新的成员后原有的成员的值会被覆盖
  • 共用体变量的地址和它的各成员的地址都是同一地址
#include <stdio.h>// 共用体也叫联合体
union Test {unsigned char a;unsigned int b;unsigned short c;
};int main() {// 定义共用体变量union Test tmp;// 1、所有成员的首地址是一样的printf("%p, %p, %p\n", &(tmp.a), &(tmp.b), &(tmp.c));// 2、共用体大小为最大成员类型的大小printf("%llu\n", sizeof(union Test));// 3、一个成员赋值,会影响另外的成员tmp.b = 0x44332211;printf("%x\n", tmp.a); // 11printf("%x\n", tmp.c); // 2211tmp.a = 0x00;printf("short: %x\n", tmp.c); // 2200printf("int: %x\n", tmp.b);   // 44332200return 0;
}

运行结果 

11
2211
short: 2200
int: 44332200

 

共用体和结构体区别

1.存储方式:

  • 存储方式
  • 结构体:结构体中的每个成员都占据独立的内存空间,成员之间按照定义的顺序依次存储
  • 共用体:共用体中的所有成员共享同一块内存空间,不同成员可以存储在同一个地址上
  • 内存占用
  • 结构体:结构体的内存占用是成员变量占用空间之和,每个成员变量都有自己的内存地址
  • 共用体:共用体的内存占用是最大成员变量所占用的空间大小,不同成员变量共享同一块内存地址

这篇关于C语言结构体与公用体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913529

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、