C语言结构体详解

article/2025/9/19 0:35:54

目录

一、结构体的基本概念

举个例子

二、结构体变量

三、结构体占用的内存情况

 举个例子

运行效果

 再次运行

四、结构体的变量名

五、结构体初始化

五、结构体初始化

举个例子

运行效果

 六、结构体成员的访问

举个例子 

运行效果

八、结构体指针

举个例子

 运行效果

九、结构体的赋值

 举个例子

运行效果

十、结构体作为函数的参数

 举个例子

运行效果


一、结构体的基本概念

结构体(struct)就是用来存放一组不同类型的数据的,语法如下:

struct 结构体名
{结构体成员变量一的声明;结构体成员变量二的声明;结构体成员变量三的声明;......结构体成员变量四的声明;
};  // 分号不要忘记

结构体是一个集合,是一种构造的数据类型,为了描述一个数据集自己定义出来的数据类型。结构体的成员(member)可以是任意类型的变量,也可以是结构体变量。

举个例子

struct boy
{char name[51];   // 姓名int  age;        // 年龄int  height;     // 身高int  weight;     // 体重char figure[31];     // 身材char face[31];     // 颜值
}; //记得加分号

二、结构体变量

结构体是一种自定义的数据类型,是模板,可以用它来定义变量。例如:

  struct boy xiaoqiu1, xiaoqiu2, xiaoqiu3;

三、结构体占用的内存情况

理论上讲结构体的各个成员在内存中是连续存放的,和数组非常类似,但是,结构体的占用内存的总大小不一定等于全部成员变量占用内存大小之和。在编译器的具体实现中,为了提高内存寻址的效率,各个成员之间可能会存在缝隙。用sizeof可以得到结构体占用内存在总大小,sizeof(结构体名)或 sizeof(结构体变量名)都OK

 举个例子

#include <stdio.h>
#include <string.h>// 定义结构体
struct boy
{char name[50];     // 姓名int  age;          // 年龄int  height;       // 身高char figure[30];       // 身材char face[30];       // 颜值
};int main()
{// 定义结构体变量struct boy xiaoqiu;printf("sizeof(struct boy) = %d\n",sizeof(struct boy));printf("sizeof(xiaoqiu) = %d\n",sizeof(xiaoqiu));return 0;
}

运行效果

从上面的例子可以看出,struct boy 全部成员变量占用的内存是50+4+4+30+30=118,但是结构体占用的内存却是 120

C语言提供了结构体成员内存对齐的方法,在定义结构体之前,增加以下代码可以使结构体成员变量之间的内存没有空隙

#pragma pack(1) // 在头文件添加

 再次运行

四、结构体的变量名

和数组不一样,结构体变量名不是结构体变量的地址,结构体变量名就是变量名,就象 int a一样,只是不能直接输出,直接输出没有任何意义。取地址要用&。

  struct boy xiaoqiu1;printf("%d\n",xiaoqiu1);   // 没有意义printf("%p\n",xiaoqiu1);   // 没有意义,结构体变量名不是结构体变量的地址。printf("%p\n",&xiaoqiu1);  // 这才是结构体的地址

五、结构体初始化

采用memset函数初始化结构体,全部成员变量的值清零。

  memset(&queen,0,sizeof(struct st_girl));

  memset(&queen,0,sizeof(queen));

注意事项,如果把一个结构体的地址传给子函数,子函数用一个结构体指针(如struct st_girl *pst)来存放传入的结构体的地址,那么,在子函数中只能用以下方法来初始化结构体:

  memset(pst,0,sizeof(struct st_girl));

不能用以下方法来初始化结构体:

  memset(pst,0,sizeof(pst));

因为子函数中用sizeof(pst),得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)。

五、结构体初始化

采用memset函数初始化结构体,全部成员变量的值清零

  memset(&xiaoqiu1,0,sizeof(struct boy));

或者

  memset(&xiaoqiu1,0,sizeof(xiaoqiu1));

注意事项,如果把一个结构体的地址传给子函数,子函数用一个结构体指针(如struct boy *pst)来存放传入的结构体的地址,那么,在子函数中只能用以下方法来初始化结构体:

  memset(pst,0,sizeof(struct boy));

不能用以下方法来初始化结构体:

  memset(pst,0,sizeof(pst));//错误案例

因为子函数中用sizeof(pst),得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)

举个例子

#include<stdio.h>
#include<string.h>
#pragma pack(1)struct boy
{char name[50];int age;int height;char figure[30];char face[30];
};void func(struct boy *pst)
{   memset(pst,0,sizeof(pst)); memset(pst,0,sizeof(struct boy));printf("sizeof(pst) = %d\n",sizeof(pst)); // 得到的是指针变量的字节数(8字节)printf("sizeof(pst) = %d\n",sizeof(struct boy));
}int main()
{struct boy xiaoqiu;memset(&xiaoqiu,0,sizeof(xiaoqiu));memset(&xiaoqiu,0,sizeof(struct boy));func(&xiaoqiu);printf("sizeof(xiaoqiu) = %d\n",sizeof(xiaoqiu));printf("sizeof(struct boy) = %d\n",sizeof(struct boy));return 0;
}

运行效果

 六、结构体成员的访问

采用圆点运算符可以访问(使用)结构的成员,结构体成员变量的使用与普通变量的使用相同

举个例子 

#include<stdio.h>
#include<string.h>
#pragma pack(1)// 定义一个结构体
struct boy
{char name[50];int age;int height;
};int main()
{// 定义一个结构体变量struct boy xiaoqiu;memset(&xiaoqiu,0,sizeof(struct boy));//初始化strcpy(xiaoqiu.name,"小酋");xiaoqiu.age = 20;xiaoqiu.height = 168;printf("名字: %s\n",xiaoqiu.name);printf("年龄: %d\n",xiaoqiu.age);printf("身高: %d\n",xiaoqiu.height);return 0;
}

运行效果

八、结构体指针

  1. 结构体是一种自定义的数据类型,结构体变量是内存变量,有内存地址,也就有结构体指针
  2. 在指针章节中我们已经知道,采用不同数据类型的指针指向不同数据类型的变量的地址,这一规则也适用于结构体

如下:

  struct boy xiaoqiu;struct boy *pst = &xiaoqiu;

通过结构体指针可以使用结构体成员,一般形式为:

  (*pst).memberName

或者:

  pst->memberName

两种写法都可以,看你个人喜欢,大多人喜欢用后者。

举个例子

#include<stdio.h>
#include<string.h>
#pragma pack(1)// 定义一个结构体
struct boy
{char name[50];int age;
};int main()
{// 定义一个结构体变量struct boy *pst,xiaoqiu;memset(&xiaoqiu,0,sizeof(struct boy));//初始化pst = &xiaoqiu;strcpy(pst->name,"小酋");pst->age = 20;printf("名字: %s\n",pst->name);printf("年龄: %d\n",pst->age);return 0;
}

 运行效果

九、结构体的赋值

结构体的成员如果是基本数据类型(int、char、double)可以用=号赋值,如果是字符串,字符串不是基本数据类型,可以用 strcpy 函数赋值,如果要把结构体变量的值赋给另一个结构体变量,可以使用 memcpy 函数

函数声明:

void *memcpy(void *dest, const void *src, size_t n);

参数说明:

  1. src 源内存变量的起始地址
  2. dest 目的内存变量的起始地址
  3. n 需要复制内容的字节数

 举个例子

#include<stdio.h>
#include<string.h>
#pragma pack(1)// 定义一个结构体
struct boy
{char name[50];int age;
};int main()
{// 定义一个结构体变量struct boy xiaoqiu1,xiaoqiu2;memset(&xiaoqiu1,0,sizeof(struct boy));//初始化memset(&xiaoqiu2,0,sizeof(struct boy));//初始化strcpy(xiaoqiu1.name,"小酋");xiaoqiu1.age = 20;memcpy(&xiaoqiu2,&xiaoqiu1,sizeof(struct boy));printf("名字:%s 年龄: %d\n",xiaoqiu1.name,xiaoqiu1.age);printf("名字:%s 年龄: %d\n",xiaoqiu2.name,xiaoqiu2.age);return 0;
}

运行效果

十、结构体作为函数的参数

结构体是多个变量集合,作为函数参数时就可以传递整个集合,也就是所有成员。如果结构体成员较多,函数参数的初始化和赋值的内存开销会很大,影响程序的运行效率。所以最好的办法就是传递结构体变量的地址

 举个例子

#include<stdio.h>
#include<string.h>
#pragma pack(1)// 定义一个结构体
struct boy
{   char name[50];int age;
};// 给结构体赋值的函数
void setvalue(struct boy *pst)
{strcpy(pst->name,"小酋");pst->age = 20;
}int main()
{// 定义一个结构体变量struct boy xiaoqiu1;memset(&xiaoqiu1,0,sizeof(struct boy));setvalue(&xiaoqiu1);printf("名字:%s 年龄: %d\n",xiaoqiu1.name,xiaoqiu1.age);return 0;
}

运行效果

 


http://chatgpt.dhexx.cn/article/2cb11PFd.shtml

相关文章

C语言结构体超详解(小白一看就懂,多维度分析!!!!)

目录 一、前言 二、结构体详解 &#x1f350;什么是结构体 &#x1f34e;结构体的定义与基础结构 &#x1f351;结构体的使用 &#x1f4a6;结构体的初始化 &#x1f4a6;结构体的成员访问 &#x1f4a6;结构体数组 &#x1f4a6;结构体指针--------------指向结构体变…

C语言之结构体(进阶篇)

目录 1.结构体的内存对齐​ 如何计算呢&#xff1f;​ 掌握结构体的对齐规则&#xff1a; 为什么存在内存对齐呢&#xff1f;​ ​​​​​​​offsetof​ 位段​ 什么是位段&#xff1f;​ 比如&#xff1a; 位段的内存分配​ 举个例子 位段的跨平台问题&#xff1a;​ 枚举…

C语言——结构体(全)

目录 一、结构体的设计 二、结构体变量的初始化 2.1结构体在内存表示&#xff1b; 2.2结构体初始化&#xff1b; 2.3结构体指针变量 2.4结构体嵌套结构体 三、结构体成员访问 3.1、结构体成员访问 3.2、结构体变量和指针 ​3.3、结构体和函数 四、结构体与数组 五、…

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…