首页 > 其他分享 >C语言自定义数据类型之结构体

C语言自定义数据类型之结构体

时间:2023-03-18 14:32:04浏览次数:38  
标签:struct 自定义 int 数据类型 C语言 对齐 声明 变量 结构

一、结构体

1.1结构体的声明语法

struct 对象名
{
成员列表;
};

1.2结构体声明的解释

结构体其实与我们在数学中学过的集合本质相同

比如,现在有一个描述房子的集合,集合里有许多元素,有的元素描述房子的大小,有的元素描述房子的价格,还有的描述房子的装饰,这里的房子就是我们描述的对象,而其中的元素就是房子具有的属性

在结构体的声明中,struct是声明结构体的关键字,不可缺少,对象名就是我们想要描述的对象,对象可以是万事万物,比如学生可以是对象,内裤可以是对象,水可以是对象

成员列表其实就是对象的属性,我们可以用C语言内置的数据类型,如char,int,double等来描述对象具有的属性,比如

struct Student //声明一个结构体类型
{
int age; //年龄
double weight; //体重
char name; //名字
};

我们声明了一个学生类的结构体,在成员列表里,我们添加了学生的年龄,姓名,体重等属性

我们也可以将结构体类型作为学生的成员,但是不可以是学生这一类型(否则会无限套娃)

1.3建立结构体变量

在声明了某一对象的结构体之后,我们该如何创建该类型的变量呢?

比如我们上文声明了学生这一对象的结构体后,如何创建具体的学生对象

在我们声明了某一结构体后,struct 对象名  就是该结构体的数据类型,

因此struct Student就是我们定义好的自定义数据类型

1.3.1再声明了某一结构体后创建

结构体数据类型 变量名;

struct Student zs;//创建结构体变量,张三(zs)

从结构体变量的创建中,我们也可以看出结构体是某一事物的集合,只是一个泛指,可创建了该类型的变量后,泛指就成了特指

1.3.2在声明的同时创建

struct Student //声明一个结构体类型
{
int age; //年龄
double weight; //体重
char name; //名字
}ls;//李四(ls)就是我们在声明的时候创建的结构体变量,ls是变量名

1.3.3小技巧

如果你觉得结构体数据类型太长,可以用关键字typedef,来对结构体类型重命名

typedef struct Student //声明一个结构体类型
{
int age; //年龄
double weight; //体重
char name; //名字
}S;
//S等价于struct Student

1.4结构体变量的初始化

依旧拿学生这一对象说明

struct Student //声明一个结构体类型
{
int age; //年龄
double weight; //体重
char name; //名字
};
int main()
{
struct Student s1={18,60.0,"zhangsan"};
//结构体变量在初始化时,对该结构体的每个成员变量都要初始化,并且与成员
列表的顺序一一对应,字符串类型要使用引号,然后整体用括号括起来
}

1.5结构体的大小与内存对齐

提到结构体的大小那么就离不开内存对齐,

例如 

struct Student //声明一个结构体类型
{
int age; //年龄
double weight; //体重
char name; //名字
};

该结构体的大小是多少呢?结构体的大小是像指针一样被具体定义呢,还是要

求得所有成员变量的大小之和呢

还是来讲讲内存对齐把,在声明结构体之后,

1.结构体的第一个成员变量的地址与结构体的起始地址相同,

2.其余变量取自身对齐数与编辑器对齐数的较小值的整数倍地址存储

这句话这么理解呢?就是说,我结构体自身是一个大房子,我的成员都在我的体内存储,而我的的第一个变量的存储地址和我的存储地址是相同的,其余的变量要按照某一个值的整数倍在我的地址中存储,而这个值就是成员变量自身的对齐数与编辑器对齐数的较小值,这个值会成为新的对齐数

成员变量的对齐数就是该变量所占字节大小,例如int占四个字节,那么这类型变量的对齐数就是4,(VS编辑器的对齐数是8)

假设每个长方形为一个字节,上述struct Student结构体内存对齐情况如下

C语言自定义数据类型之结构体_数据类型

3.结构体大小为最大对齐数的整数倍

存储int用了4个字节,浪费了4个字节,存储double是8个字节,char是一个字节,一个17个字节,int的对齐数为4,double为8,char为1,最大对齐数为8,

结构体大小取最大对齐数的整数倍并且能存储下17个字节,因此结构体最终大小为24个字节,调试结果如下

C语言自定义数据类型之结构体_数据类型_02



标签:struct,自定义,int,数据类型,C语言,对齐,声明,变量,结构
From: https://blog.51cto.com/u_15466618/6129657

相关文章

  • 自定义注解和使用
    格式:public@interface注解名{public属性类型属性名 () default默认值;//如果不想给默认值,default可以省略}packageanno;//在使用注解的时候,如果......
  • 初识c语言
    1.程序语言C语言是目前极为流行的一种计算机程序设计语言,它既具有高级语言的功能,又具有汇编语言的一些特性,且支持ANSIC。C语言的特点:通用性及易写易读,是一种结构化程序......
  • mysql 常用的数据类型
    官网文档地址:https://dev.mysql.com/doc/refman/8.0/en/data-types.html常用的数据类型:NumericDataTypesDateandTimeDataTypesStringDataTypes,SpatialData......
  • 【转载】集合中元素的数据类型可以不同,但集合中不能嵌套列表、元组、集合、字典
    1、问题根源:text={"a":{"aa":1,"b":2},"b":2,"c":3,"d":4,"e":5}list_dict=[{v:text[v]}forvintext]set(list_dict)输出:TypeError......
  • 数据类型转换、运算符
    day02数据类型太简单,没啥写的,略注意:空串""是长度为0的字符串。空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前......
  • 带自定义Kubernetes资源验证器的开发人员护栏
    如果你的组织开始采用云原生技术,那么可能仍在研究如何将Kubernetes知识内部化并分发给团队的其他成员。这是一个非常普遍的问题。需求是明确的:为了高效工作并产生高质量的部......
  • java基础_基本数据类型
    介绍鄙人才疏学浅,如有谬论,敬请指教。计算机储存容量单位讲解计算机储存容量基本单位就是字节(Byte),而字节下面还有一个比特>(bit),对应关系是一个字节=八个比特,比特(bit......
  • C语言_求n阶乘
    #include"stdio.h"main(){ longi,sum; printf("请输入一需要求阶乘的数:"); scanf("%ld",&i); sum=1; while(i>1) { sum=sum*i; i--; } printf("\n这个数......
  • C语言_输入小写字母输出大写字母
    #include"stdio.h"main(){ charx; printf("请输入一个小写字母:"); scanf("%c",&x); switch(x) {case'a': printf("这个字母的大写是A"); break; case'b': pri......
  • c语言_输入一行字符输出统计
    #include<stdio.h>intmain(){ charc; intletters=0,space=0,digit=0,other=0; printf("请输入一行字符:"); while((c=getchar())!='\n') ......