基本概述:
int double char;
定义一个学生类型 int Student 姓名 性别 年龄
简单地说 结构体是一个可以包含不同类型的结构,他是一个自定义的类型。

struct 结构体标识符{成员变量;};
struct 是系统关键字,用来说明当前定义了一个自定义类型
结构体标识符 为了遵循c标识符命名规则的一个标识符
//struct 2B{}; 该种命名方式是不可以的
成员变量列表 用于描述此类事物的某一方面的特性 变量可以为基本数据类型和史震类型,也可以是

结构体的对齐补齐的存储方式 为了方便CPU读取
1.第一个数据成员存储在第0个位置
2.之后的每一个成员存储的起始位置是要从该成员大小的整数倍开始存放
3.结构体的总大小,必须是其内部最大成员(成员中大小最大的那个的整数倍)的整数倍,不足就要不齐。

结构体大小比实际定义的大小要大

位域:用来节约内存 存储少量信息

案例测试代码如下:

 #include<stdio.h>
#include<string.h>
#include<windows.h> #pragma warning(disable:4996)//解决在vs2013中strcpy出错,原因是strcpy安全性太低 vs弃用了 改成了strcpy_s struct People
{
char name[];
char sex[];
int age;
}; //结构体的声明
// .c是c语言文件 .cpp是c++文件 在c++中结构体使用的时候是可以省去struct struct P
{
int a;
double b;
char c;
}pe,*ppe;
//typedef 用来给数据类型起别名
//pe --->struct p
//*ppe ----->struct p* //typedef int[5] INT_ARR_5; //定义一个数组的别名 该种定义的方式是错误的
//typedef int INT_ARR_5[5];//要这样定义 typedef int INT_ARR_5 [];
typedef int(*p)(int, int); //函数指针的别名,名字就是p int(*)(int,int);是一个函数指针
typedef int(*pArr)[]; int MySwap(int a, int b)
{
printf("交换函数:\n");
return ;
} struct LvLiYu //位域 为了节省内存空间 用多少给多少
{
int a : ; //4字节 32位 只拿了32位(包括符号位的)中的一位用来存储a 二进制位
int b : ;//8位
int c : ;//10位
int d : ;//5位
int e : ;//1位 都是按位存储
}; int main()
{
#if 0
struct People PangQi; //定义了一个自定义的变量 PangQi
PangQi.age = ;
//PangQi.name = pangqi; //该种描述的方式是错误的 原因是数组名是一个地址,所以用一个常量来等于一个地址是错误的
//所以要用字符串拷贝函数
strcpy_s(PangQi.sex, "女");
strcpy_s(PangQi.name, "艾迪");
printf("姓名:%s\t性别:%s\t年龄:%d\t\n", PangQi.name, PangQi.sex, PangQi.age);
#endif #if 0
//该案例存在缓冲区残留写入的bug,在输入年龄的时候如果字符过长会直接跳过第二个学生的姓名输入
//解决方法 在数据输入循环中加入一句清空缓存取得命令 fflush(stdin);
struct People Student[];
for (int i = ; i < ; i++)
{
printf("请输入第%d个同学的姓名:",i+);
scanf("%s", Student[i].name); printf("请输入第%d个同学的性别:", i + );
scanf("%s", Student[i].sex); printf("请输入第%d个同学的年龄:", i + );
scanf("%d", &Student[i].age); fflush(stdin); //清空输入流缓冲区
}
printf("姓名\t\t性别\t\t年龄\t\t\n");
for (int i = ; i < ; i++)
{
printf("%s\t\t%s\t\t%d\n", Student[i].name,Student[i].sex,Student[i].age);
} #endif // printf("%d",sizeof(struct P));//结构体的对齐与补齐 //typedef int age;
// age age= 58;//别名 #if 0
INT_ARR_5 a;
for (int i = ; i < ; i++)
{
a[i] = i + ; //这里说明a是一个数组 应为我们在前面定义了提个int型的数组别名INT_ARR_5
}
int b;//这里我们定义b是一个整型变量 并不是一个数组
b[];//所以此处会显示错误
#endif #if 0
INT_ARR_5 a[]; //这种形式就表示一个二维数组 等价于int a[3][5]
for (int i; i < ; i++)
{
for (int j; j < ; j++)
{
scanf("%d",&a[i][j]);
}
}
#endif #if 0
p Yu; //定义函数指针的变量
Yu = MySwap; //函数指针的变量保存函数地址
Yu(, );
#endif #if 0
int Arr[][] = { , , , , , , , , , , , , , , };
pArr p;
p = Arr; //p 指向Arr[0] p+1指向Arr[1]
printf("%d", **(p + ));
#endif #if 0
printf("%d\n", sizeof(struct LvLiYu));
struct LvLiYu HongLiYu;
HongLiYu.a = ;
printf("%d\n", HongLiYu.a);
#endif getchar();
return ;
}

注:在代码中的#if 1/0 #endif 是预编译部分,可以用来当做注释

2019-03-26  09:23:34

C++学习(二十五)(C语言部分)之 结构体2的更多相关文章

  1. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  2. 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写

    一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...

  3. Salesforce LWC学习(二十五) Jest Test

    本篇参看: https://trailhead.salesforce.com/content/learn/modules/test-lightning-web-components https://j ...

  4. JavaWeb学习 (二十五)————监听器(Listener)

    一.监听器介绍 1.1.监听器的概念

  5. ElasticSearch7.3学习(二十五)----Doc value、query phase、fetch phase解析

    1.Doc value 搜索的时候,要依靠倒排索引: 排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序. 所谓的正排索引,其实就是doc values. 在建立索引 ...

  6. ballerina 学习二十五 项目docker 部署&& 运行

    ballerina 官方提供了docker 的runtime,还是比较方便的 基本项目创建 使用cli创建项目 按照提示操作就行 ballerina init -i 项目结构 添加了dockerfil ...

  7. 【学习笔记】【C语言】指向结构体的指针

    1.指向结构体的指针的定义 struct Student *p;  2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...

  8. 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧

    目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...

  9. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  10. C#学习基础概念二十五问

    C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...

随机推荐

  1. \x 和 0x 的区别

    1.0x 表示整型数值 (十六进制) char c = 0x42; 表示的是一个数值(字母B对应的ASCII码——  66),可以认为等价于: int c = 0x42; 2.\x42用于字符表达,或 ...

  2. 【Java算法】输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数

    import java.util.Scanner; public class CountZimuShuzi { public static void main(String[] args) { Sys ...

  3. Vue + Element UI 实现权限管理系统(动态加载菜单)

    动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...

  4. java实现按中文首字母排序的方式

    public class ABD { public static void main(String[] args) { //Collator类是用来执行区分语言环境的String比较的,这里是选择CH ...

  5. 老毛桃制作装机版u盘

    启动盘准备工作: ① 老毛桃官网首页下载老毛桃v9.3装机版u盘启动盘制作工具安装到电脑上: ② 准备一个容量大在4G以上并能够正常使用的u盘. 第一步 到老毛桃官网中下载老毛桃v9.3安装包到系统桌 ...

  6. sqlalchemy tree 树形分类 无限极分类的管理。预排序树,左右值树。sqlalchemy-mptt

    简介: 无限极分类是一种比较常见的数据格式,生成组织结构,生成商品分类信息,权限管理当中的细节权限设置,都离不开无限极分类的管理. 常见的有链表式,即有一个Pid指向上级的ID,以此来设置结构.写的时 ...

  7. Sql Server 中 根据列名查询表名

    已知列名 ELEMENT_ID ,查询所属表名称 Select O.name objectName, C.name ColumnName from sys.columns C inner join s ...

  8. sas 变量类型转换

    data b2: set b1; newbl=put(oldbl,10.); run; 根据转换后的类型灵活填写

  9. FPGA的GTP(aurora 协议)高速串行接口数据收发(转)

    reference:https://blog.csdn.net/qq_40261818/article/details/83039829 PG046-Aurora 8B/10B  Logicore I ...

  10. 数位DP详解

    算法使用范围 在一个区间里面求有多少个满足题目所给的约束条件的数,约束条件必须与数自身的属性有关 下面用kuangbin数位dp的题来介绍 例题  不要62 题意:在一个区间里面求出有多少个不含4和6 ...