C语言结构体详细图解分析

目录
  • 结构体
    • 结构体的声明
    • 结构体变量的定义和初始化
    • 结构体大小计算

结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员是不同类型的变量。

为什么要有结构体

比如说,描述一个学生时,需要有

  • 名字
  • 性别
  • 年龄
  • 身高

来一起描述,需要不同的变量,便有了结构体类型来描述

结构体的声明

struct tag
{
	member-lest//成员列表
}variable-list;//变量列表

例如一个学生

struct stu
{
	char name[20];
	char sex[5];
	int age;
	int hight;
};//这里有没有变量列表都可以

struct stu
{
	char name[20];
	char sex[5];
	int age;
	int hight;
}s2,s3,s4;//s2,s3,s4全局变量
struct stu s5;
int main()
{
	struct stu s1;//结构体变量
}

特殊声明

在声明结构体时候,可以不完全声明

struct
{
	char c;
	int a;
	double a;
}sa;//匿名结构体变量,必须在此处定义变量,否则以后不能使用
int main()
{
	return 0;
}

编译器认为ps和&sa是两种类型,这种写法是错误的

数据结构:数据在内存中存储的结构

关于列表

struct node
{
	int date;
	struct node next;
};
int main()
{
	return 0;
}

这样无法判断结构体大小 只需在结构体存放能找到下一个结构体内容的指针即可

struct node
{
	int date;
	struct node* next;
};
int main()
{
	return 0;
}

也可以这样(重命名使用举例)

typedef struct node
{
	int date;
	struct node* next;
}node;

int main()
{
	struct node n2 = { 0 };//2者都可以使用
	node n = { 0 };//尽量不对结构体使用typedef
}

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

struct point
{
	int x;
	int y;
}p1;             //声明类型同时定义变量p1
struct point p2;//定义结构体变量p2

//初始化:定义变量的同时赋初值
struct point p3 = { 1,2 };

struct stu         //类型声明
{
	char name[15];//名字
	int age;      //年龄
};
struct stu s = { "zhangsan",20 };//初始化

struct node
{
	int date;
	struct point p;
	struct node* next;
}n1 = { 10,{4,5},NULL };          //结构体嵌套初始化

struct node n2 = { 20,{5,6},NULL };//结构体嵌套初始化

结构体大小计算

先来观察下列代码

#include <stdio.h>
int main()
{
	struct S1

{
	char c1;
	int i;
	char c2;
};
printf("%d\n", sizeof(struct S1));
//练习2
struct S2
{
	char c1;
	char c2;
	int i;
};
printf("%d\n", sizeof(struct S2));
//练习3
struct S3
{
	double d;
	char c;
	int i;
};
printf("%d\n", sizeof(struct S3));
//练习4-结构体嵌套问题
struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
printf("%d\n", sizeof(struct S4));
return 0;
}

发现并不是数据类型大小的简单相加

存在对齐

如何计算?
首先得掌握结构体的对齐规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
为什么存在内存对齐 ?
大部分的参考资料都是如是说的:
1. 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特
定类型的数据,否则抛出硬件异常。

到此这篇关于C语言结构体详细图解分析的文章就介绍到这了,更多相关C语言 结构体内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言的结构体你了解吗

    目录 结构体内存对齐 结构体传参 结构体实现位段 什么是位段 位段在内存中的存储 位段的问题 总结 结构体内存对齐 当我们创建一个结构体变量时,内存就会开辟一块空间,那么在创建结构体变量时内存到底是怎么开辟空间的呢?会开辟多大的空间呢?我们来看一下下面的代码 struct S { int i; char c; char b; }; struct G { char c; int i; char b; }; int main() { struct S u; struct G g; printf("%

  • C语言自定义类型超详细梳理之结构体 枚举 联合体

    目录 一.什么是结构体 1.结构体实现 2.匿名结构体类型 3.结构体自引用 4.结构体的内存对齐 5.结构体位段  二.什么是枚举 1.枚举类型的定义 2.枚举的优点 三.联合(共用体) 1.什么是联合(共用体) 2.联合(共用体)的定义 3.联合(共用体)的初始化 总结 一.什么是结构体 结构是一些值的集合,这些值称为成员变量.结构的每个成员可以是不同类型的变量. //结构体声明 struct tag //struct:结构体关键字,tag:标签名,合起来是结构体类型(类型名) { memb

  • 一起来看看C语言世界中的结构体

    目录 一.结构体的概念: 二.结构体变量的定义和初始化 结构体变量的定义 (1)单独定义 (2)混合定义(在定义结构体的同时定义结构体变量) 结构体变量的初始化 三.结构体变量的使用("."与"->"的使用) (1)"."的使用(1级运算符,结合方向从左到右): (2)"->"的使用(1级运算符,结合方向从左到右): 总结 一.结构体的概念: 结构体是由一批数据聚合而成的结构型数据. 引入结构体,程序设计人员就可以

  • 深入浅出理解C语言初识结构体

    目录 1.定义和使用结构体变量 结构体的基础知识 自己建立结构体类型 struct 结构体名 类型名 成员名: 声明结构体的形式 结构体的初始化 2. 结构体成员的访问 3.结构体传参 1.定义和使用结构体变量 结构体的基础知识 结构是一些值的集合,这些值称为成员变量.结构的每个成员可以是不同类型的变量. 自己建立结构体类型 结构的成员可以是标量.数组.指针,甚至是其他结构体. struct 结构体名 {成员表列}:↓ 注意:结构体类型的名字由一个关键字 struct 和结构体名组合而成的(例如

  • C语言结构体指针引用详解

    目录 指向结构体变量的指针 指向结构体数组的指针 结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针. 指向结构体变量的指针 前面我们通过"结构体变量名.成员名"的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针. 前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址.如果定义一个指针变量 p 指向这个地址的话,p 就可以指向结构体变量 student1 中的任意一个成员. 那么,这个指针变量定义成

  • C语言中结构体实例解析

    目录 一.结构体定义 二.实例演示 结构体作为函数参数 结构体指针 三.typedef struct 和 struct的区别 1.声明不同 2.访问成员变量不同 3.重新定义不同 总结 一.结构体定义 C语言结构体由一系列相同或者不同类型的数据构成的集合,结构体类型就是以struct关键字定义的数据类型. 结构体的格式如下: struct 结构名称 { 结构体所包含的数据成员,包括变量数组等 } 结构变量 ;//结构变量可以指定一个或多个 举例: struct Student { char na

  • C语言结构体的全方面解读

    目录 前言 一.结构体的声明与定义 1.结构体的声明 2.结构成员的类型 3.结构体的定义 二.初始化结构体 三.访问结构体成员 四.结构体嵌套 五.结构体指针 六.结构体传参 总结 前言 C语言提供了不同的数据类型,比如说int.float.double.char等,不同的类型决定了一个变量在内存中应该占据的空间以及表现形式. 但是,当我们定义一个人的时候,人的不同属性就比较难用同一个数据类型来定义了,因为人的身高.年龄.体重等属性往往需要不同数据类型,在这个时候,我们便引入结构体这个概念.

  • C语言结构体详细图解分析

    目录 结构体 结构体的声明 结构体变量的定义和初始化 结构体大小计算 结构体 结构是一些值的集合,这些值称为成员变量.结构的每个成员是不同类型的变量. 为什么要有结构体 比如说,描述一个学生时,需要有 名字 性别 年龄 身高 来一起描述,需要不同的变量,便有了结构体类型来描述 结构体的声明 struct tag { member-lest//成员列表 }variable-list;//变量列表 例如一个学生 struct stu { char name[20]; char sex[5]; int

  • C语言结构体超详细讲解

    目录 前言 1.结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2.结构体成员的访问 2.1 点操作符访问 2.2 ->操作符访问 3.结构体传参 3.1 参数是结构体类型的变量 3.2 参数是结构体类型的变量的地址 3.3 结构体传参对比 总结 前言 本文开始学习结构体的知识点,主要内容包括: 结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 1.结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成

  • C语言结构体(struct)的详细讲解

    目录 引言 1. 动态内存管理 2. 结构体 2.1 定义语法 2.2 定义示例 2.3 初始化 2.4 结构体赋值 2.5 结构体数组 2.6 结构体指针赋值 3. 学生管理系统 附:结构体变量的存储原理 总结 引言 当前文章介绍动态堆空间内存分配与释放,C语言结构体定义.初始化.赋值.结构体数组.结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用. 1. 动态内存管理 C语言代码----->编译----->链接------>可执行的二进制文件(windows下x

  • C语言 结构体(Struct)详解及示例代码

    前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放. 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{     结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可

  • 一文读懂c语言结构体在单片机中的应用

    Struck 看到单片机中有很多struck 的应用,但是呢我当初学C语言的时候又没有很认真的去学习,今天复习下,写一篇小小的交流,希望能够给大家带来帮助. 1.struck的定义 /***********方式一**********/ struct Book { char title[128]; char aurhor[40]; float price; unsigned int date; char pubilsher[40]; }; /*定义了Book这个模板*/ struct Book b

  • C语言结构体数组的定义和使用详解

    目录 介绍 结构体数组定义时初始化 补充 介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这时就要使用数组.结构体中也有数组,称为结构体数组.它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项. 定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组.或者说同前面介绍的普通数组

  • go语言结构体指针操作示例详解

    目录 指针 go指针操作 不能操作不合法指向 new函数 指针做函数的参数 数组指针 结构体指针变量 结构体成员普通变量 结构体成员指针变量 结构体比较和赋值 结构体作为函数参数 指针 指针是代表某个内存地址的值.内存地址储存另一个变量的值. 指针(地址),一旦定义了不可改变,指针指向的值可以改变 go指针操作 1.默认值nil,没有NULL常量 2.操作符“&”取变量地址,“*“通过指针(地址)访问目标对象(指向值) 3.不支持指针运算,不支持“->”(箭头)运算符,直接用“.”访问目标成

  • GO语言结构体面向对象操作示例

    目录 匿名字段初始化 成员的操作 同名字段 非结构体匿名字段 结构体指针类型匿名字段 面向过程和对象函数的区别 为结构体类型添加方法 指针变量方法集 普通变量方法集 方法的继承 方法的重写 方法值 方法表达式 匿名字段初始化 package main import "fmt" type Person struct { name string //名字 sex byte //性别 age int //年龄 } type Student struct { Person //只有类型,没有名

  • 详解C语言结构体,枚举,联合体的使用

    目录 一.匿名结构体 二.结构体的自引用 1.声明时不要自己引用自己 2.结构体重命名时不能使用重命名 三.结构体内存对齐规则 1.结构体内存计算 2.结构体嵌套 3.通过调整结构体成员顺序,压缩内存 四.存在内存对齐的原因 五.修改默认对齐数 六.结构体传参 七.位段 1.位段在内存中的存储 2.位段的跨平台问题 八.枚举 1.枚举的定义 2.枚举的优点 九.联合体(共用体) 1.联合体大小的计算 2.使用联合体判断计算机的大小端字节序 一.匿名结构体 struct { char name[2

  • Go语言结构体Go range的学习教程

    目录 正文 Go Range 正文 在前一篇博客我们学习了 Go 数组,其要求所有元素为同一数据类型,如果希望存储不同类型的数据,就要用到结构体相关知识. 结构体的定义:存储相同或不同类型的数据集合. 有 C 相关经验,结构体还是比较容易理解的,语法格式如下所示: type struct_variable_type struct { member definition member definition ... member definition } 上述语法格式的关键字是 struct 和 t

随机推荐