C语言——结构体(全)

article/2025/9/19 1:19:58

目录

一、结构体的设计

二、结构体变量的初始化

2.1结构体在内存表示;

2.2结构体初始化;

 2.3结构体指针变量

 2.4结构体嵌套结构体

三、结构体成员访问 

3.1、结构体成员访问

3.2、结构体变量和指针

​3.3、结构体和函数 

四、结构体与数组

五、计算结构体大小

三个规则:

例1、​

 例2、

指定对齐值

总结


一、结构体的设计

C语言提供了基本的数据结构,例如 char 、short 、int 、float....等类型;这些偶称为内置类型。怎样设计出来属于自己的类型?

程序员可以使用结构体来封装一些属性,设计出新的类型,在C语言中称为结构体类型。

结构体的定义形式为

struct 结构体名
{成员列表(可以是基本的数据类型,指针,数组或其他结构类型)
};

举个例子来说吧;

客观事务(实体)是复杂的,要描述它必须从多方面进行;也就是用不同的数据类型来描述不同的方面;用学生实体来说:

学生拥有什么? 学号、姓名、性别、年龄;

struct Student
{char s_id[8];char s_name[8];char s_sex[4];int s_age;
};

注意以下几点;

(1)、关键字struct是数据类型说明符,指出下面说的是结构体类型;

(2)、标识符Student是结构体的类型名;

(3)、最后的分号一定要写;

二、结构体变量的初始化

结构体是一种数据类型,也就是说可以用它来定义变量。

结构体就像一个“模板”,定义出来的变量都具有相同的性质。可以将结构体比作“图纸”,结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的;

结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据、需要存储空间;

2.1结构体在内存表示;

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16

 C语言中  struct 不可少

2.2结构体初始化;

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16

 2.3结构体指针变量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16

 2.4结构体嵌套结构体

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16

三、结构体成员访问 

3.1、结构体成员访问

结构体变量使用   .   访问;

结构体变量.对象

#include<stdio.h>
#include<string.h>
struct Date
{int year;int month;int day;
};
struct Student
{char s_name[20];struct Date birthday;float score;
};
int main()
{struct Student stu = { "liuwen",2000,10,1,99.9 };printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);stu.score = 77;printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);return 0;

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16

注意:对结构体变量整体赋值有三种情况

 (1)定义结构体变量(用{}初始化)

(2)用已定义的结构体变量初始化

(3)结构体类型相同的变量可以作为整体相互赋值;

在C语言中不存在结构体类型的强制转换。

3.2、结构体变量和指针

内置类型可以定义指针变量,结构体类型也可以定义结构体类型指针;

结构体类型指针访问成员的获取和赋值形式:

(1)(*p). 成员名(.的优先级高于*,(*p)两边括号不能少)

(2)   p->成员名(->指向符)

示例:

#include<stdio.h>
#include<string.h>
//#define _CRT_SECURE_NO_WARNINGS
struct Inventory//商品
{char description[20];//货物名int quantity;//库存数据
};
int main()
{struct Inventory sta = { "iphone",20 };struct Inventory* stp = &sta;char name[20] = { 0 };int num = 0;(*stp).quantity = 30;stp->quantity = 30;strcpy_s(name,sizeof(stp->description),stp->description);printf("%s %d\n", stp->description, stp->quantity);printf("%s %d\n", (*stp).description, (*stp).quantity);return 0;
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_15,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16 3.3、结构体和函数 

示例:

#include<stdio.h>
#include<string.h>
#define _CRT_SECURE_NO_WARNINGS
struct School
{char s_name[20];//学校int s_age;
};
void Print_a(struct School sx)
{printf("%s %d\n", sx.s_name, sx.s_age);
}
void Print_c(struct School* sp)
{printf("%s %d\n", sp->s_name, sp->s_age);
}
int main()
{struct School sx = { "xi'an",100 };Print_a(sx);Print_c(&sx);return 0;
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_13,color_FFFFFF,t_70,g_se,x_16

 内存什么的看上面;

两种传参那个更好?通过内存可以看出来;

四、结构体与数组

结构体数组,是指数组中的每一个元素都是一个结构体类型。在实际应用中,C语言结构体数组常被用来表示有相同的数据结构的群体,比如一个班的学生,一个公司的员工等;

例如:

#include<stdio.h>
#include<string.h>
#define _CRT_SECURE_NO_WARNINGS
struct Student
{char s_name[20];//姓名int age;//年龄float score;//成绩
};
int main()
{struct Student cla[] ={{"liuwen",18,149.9},{"qnge",18,145},{"anan",19,188},};return 0;
}

五、计算结构体大小

三个规则:

(1)、结构体变量的首地址,必须是结构体变量的“最大基本数据类型成员所占字节数”的整数倍;

(2)结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍;

(3)、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节”的整数倍;

示例:假设总零地址开始(计算)

例1、

struct node
{char cha;int ia;char chb;
};
int main()
{int size = 0;struct node sd = { 'a',2,'b' };printf("%d\n", sizeof(struct node));//12return 0;
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_12,color_FFFFFF,t_70,g_se,x_16

 例2、

struct node
{char cha;char chb;int ia;
};
int main()
{int size = 0;struct node sd = { 'a','b',2 };printf("%d\n", sizeof(struct node));//12return 0;
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bCP5ZyG6IS4,size_12,color_FFFFFF,t_70,g_se,x_16

为什么要理解字节对齐问题?

(1)内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问变量,但是实际上, cup并非逐字节读写内存,而是以2,4,或8的倍数的字节块来读写内存,因此就会对基本数据类型的地址作出一些限制, 即它的地址必须是2, 4或8的倍数。那么就要求各种数据类型按照一定的规则在空间. 上排列,这就是对齐。

(2)有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。

(3)由于不同平台对齐方式可能不同,如此一来,同样的结构在不同的平台其大小可能不同,在无意识的情况下,互相发送的数据可能出现错乱,甚至引|发严重的问题。

指定对齐值

预处理指令# pragma pack(n)可以改变默认对齐数。n取值是1,2, 4,8, 16。

总结

1)结构体变量的首地址,必须是MIN{"结构体最大基本数据类型成员所占字节数",指定对齐方式}大小的整数倍。
2)结构体每个成员相对于结构体首地址的偏移量,都是MIN{基本数据类型成员,指定对齐方式}大小的整数倍。
3)结构体的总大小,为MIN{结构体“最大基本数据类型成员所占字节数”(将嵌套结构体里的基本类型也算上,得出最大基本数据类型成员所占字节数),指定对齐方式} 大小的整数倍。
 


 


http://chatgpt.dhexx.cn/article/4hZ9bXEa.shtml

相关文章

Github客户端下载慢的解决方法

Github客户端下载慢的解决方法 Github客户端下载解决方法获取下载连接 Github客户端下载 Github客户端的下载地址是——Github客户端下载。 但是下载速度特别慢&#xff0c;最快也就十几K。 解决方法 使用迅雷下载&#xff1a;将Github客户端的下载地址复制到迅雷中&#…

windows平台下使用Github(2 创建代码仓库,安装Github客户端.)

本文会分章节的来介绍如何在windows平台下使用GitHub 一、注册Github账号 查看 二、创建代码仓库&#xff0c;安装Github客户端.查看 三、Github上传和下载(1 客户端方式)查看 四、Github上传和下载(2 命令行方式)查看 1、创建一个代码托管仓库。 点击右上角的 号或者点…

github客户端进行token认证

从 2021 年 8 月 13 日起&#xff0c;GitHub 在对 Git 操作进行身份验证时不再接受帐户密码。您需要添加 PAT&#xff08;个人访问令牌&#xff09;&#xff0c;您可以按照以下方法在您的系统上添加 PAT。 git - Support for password authentication was removed. Please us…

【解决】GitHub 客户端下载后安装在哪里?

GitHub Desktop 配置环境变量GitHub 安装路径GitHub Shell、Bash 环境是 Windows 10。 从 GitHub 官网下载了 GitHub 的 Desktop 版本之后&#xff0c;它其实不仅是一个 GUI&#xff0c;还带了 Shell&#xff08;Bash&#xff09;&#xff0c;但是发现找不到它们是被安装在哪个…

GitHub客户端上传本地代码

创建GitHub账号、安装GitHub客户端登录GitHub网站、在客户端登录账户创建新的代码存放处 填写及勾选一些信息 复制此代码存放处的路径 利用客户端上传代码 第一步&#xff1a;点击第五步的Open in Desktop&#xff0c;打开本地客户端 第二步&#xff1a;点击下图蓝色选中选…

你们心心念念的 GitHub 客户端终于来了!

点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 For something,we cant understand when we are young but by the time we understand,we are no longer young. 有些事情&#xff0c;当我们年轻的时候无法懂得&#x…

GitHub客户端的使用方法

一&#xff1a;创建自己的GitHub账号 GitHub官网链接 https://github.com/ 自行创建账号&#xff0c;因本文主要介绍GitHub客户端的使用方法&#xff0c;所以注册账号略 二&#xff1a;下载GitHub客户端 GitHub客户端下载的官网链接 https://desktop.github.com/ 下载完成之…

gitHub客户端的安装与使用总结

一、第一步 注册github账号 1.注册界面 https://github.com/&#xff0c;如下图&#xff1a; 2.下注册流程 3.上面简单的输入一下用户名、邮箱地址、密码点击创建即可&#xff0c;进入下一步&#xff0c;如下图&#xff1a; 如果勾选了“Help me set up an organization next”…

Github客户端安装使用教程(一)

转载请注明出处&#xff0c;http://blog.csdn.net/bule_zst/article/details/74185268 1. 下载安装 下载地址 下载好后双击运行&#xff0c;这个安装程序比较奇葩&#xff0c;是强制安装路径的&#xff0c;运行后什么界面都没有&#xff0c;后台安装&#xff0c;大概等到你觉…

GitHub Windows 客户端使用教程

GitHub Desktop tutorial 一、前期准备 下载安装 GitHub Windows 客户端&#xff0c;链接在这里。 二、登录账号 在客户端登录自己的 GitHub 账号。 三、选择要上传的 repository 进行 Clone 比如我 Clone 了 LeetCode-Solutions。 然后选择 URL 进行 Clone 。 进入主界面…

github客户端教程

在网上搜索了下github的教程,都是讲的用命令行去提交代码的,真心不想这么麻烦,都有客户端了,还去这么麻烦,程序员还要着干嘛呢.于是网上找了一份客户端的教程,转载过来. 一&#xff1a;下载GitHub for Windows 2.0 下载地址&#xff1a;https://windows.github.com/ 二&#xf…

github客户端使用

用github windows离线版安装好之后&#xff08;需要安装的请留邮箱&#xff09;。安装好之后桌面呈现 点击左侧图标进入客户端&#xff0c;进入登录界面如下图 输入帐号密码登录&#xff0c;如果没有去官网申请一个。 登录之后&#xff0c;先进行第一步&#xff0c;新建…

github客户端的下载

在github官网上&#xff0c;下载客户端完成后&#xff0c;安装时还需要下载一些文件。但是我之前安装了很多次&#xff0c;都是下载了20多M就停止了&#xff0c;提示下载终止。之后就只能从开始下载&#xff0c;一直安装不成功。一直停留了2周时间&#xff0c;期间也在网上搜过…

新手使用GitHub客户端提交本地项目到GitHub网站详细步骤

1.下载https://windows.github.com/ github客户端 2.安装完github&#xff0c;会出现 点击GitHub&#xff0c;Git Shell是命令行指令&#xff0c;暂时用不上 3.点击进入之后 输入你在https://github.com上面注册的用户名和密码点击log in 4.登录之后新建项目 点击左上角…

新版GitHub客户端上传文件夹教程笔记

新版GitHub客户端上传文件夹教程笔记 文章目录 新版GitHub客户端上传文件夹教程笔记前言&#xff1a;上传文件夹步骤&#xff1a; 前言&#xff1a; 相信很多人和我一样&#xff0c;用GitHub的目的就是上传一下自己的代码&#xff0c;并不想学什么花里胡哨的命令行操作&#x…

GitHub客户端 Desktop使用

一、注册GitHub账号 GitHub官网注册&#xff1a;https://githua.com/join 二、进入GitHub官网下载客户端 GitHub官网网址&#xff1a;https://desktop.github.com/目前只支持macOS或Windows系统&#xff0c;选择对应的系统配置下载客户端。 三、登录Desktop客户端 点击坐…

好工具推荐系列:Github客户端GitHub Desktop使用方法

Github使用教程&#xff08;一&#xff09;------ 初识Github Github使用教程&#xff08;二&#xff09;------ 初识Github git学习--GitHub上如何进行PR(Pull Request)操作 github----向开源框架提交pr的过程 客户端1&#xff1a;GitHub Desktop | Simple collaboration f…

Github客户端下载以及使用方法

Github客户端下载以及使用方法 一.创建属于自己的github账号 github官网&#xff1a;https://github.com/ 还没有github账号的可以借鉴我写的这篇文章进行注册&#xff0c;并创建一个仓库&#xff1a;https://editor.csdn.net/md/?articleId115933822 下载github客户端 gi…

github客户端的使用

概述 客户端的使用比较的简单&#xff0c;对于一些比较复杂的功能用命令行比较难实现。所以客户端可以简化我们的操作。节省我们的时间 下载地址 github客户端下载地址 使用 1. 克隆远程仓库到本地 单机仓库 add选择 输入远程仓库的网址和选择本地仓库的路径 2.提交修改…

github客户端工具

github客户端工具 github好用的桌面工具------github for Windows&#xff0c;可以管理自己的github上的仓库&#xff0c;下载地址如下&#xff1a; https://desktop.github.com/&#xff0c;这是官网地址&#xff0c;下载比较慢。 可以在我的百度网盘中下载&#xff0c;下载地…