C++学习(二十五)(C语言部分)之 结构体2
基本概述:
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的更多相关文章
- Java开发学习(二十五)----使用PostMan完成不同类型参数传递
一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...
- 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写
一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...
- Salesforce LWC学习(二十五) Jest Test
本篇参看: https://trailhead.salesforce.com/content/learn/modules/test-lightning-web-components https://j ...
- JavaWeb学习 (二十五)————监听器(Listener)
一.监听器介绍 1.1.监听器的概念
- ElasticSearch7.3学习(二十五)----Doc value、query phase、fetch phase解析
1.Doc value 搜索的时候,要依靠倒排索引: 排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序. 所谓的正排索引,其实就是doc values. 在建立索引 ...
- ballerina 学习二十五 项目docker 部署&& 运行
ballerina 官方提供了docker 的runtime,还是比较方便的 基本项目创建 使用cli创建项目 按照提示操作就行 ballerina init -i 项目结构 添加了dockerfil ...
- 【学习笔记】【C语言】指向结构体的指针
1.指向结构体的指针的定义 struct Student *p; 2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...
- 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧
目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- C#学习基础概念二十五问
C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...
随机推荐
- linux系统管理 系统进程
进程介绍 '进程' 进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源 ps命令基本使用 ps命令用来查看在计算机系统中那些程序正在执行,以及执行的 ...
- images
- 【转】c++ make_pair函数使用
[好记性不如烂笔头:在<C++ Templates>看到这个函数,发现正是前段时间写项目程序所要用到的,可惜当时还不知道有这个用法,当时是自己写了个结构体..]Utilities < ...
- HashMap实现原理分析--面试详谈
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- transiton,transform,animation,border-image
animation,transition,transform三者联系与区别: https://www.jianshu.com/p/0e0e1903b80d transform: 使用小技巧: tran ...
- tomcat 启动Spring boot 项目
SpringBoot 项目如何在tomcat容器中运行 1.相关连接: https://blog.csdn.net/u010598360/article/details/78789197/ 2.修改打 ...
- 国行 lg g3 D858 刷 lg g3 D858hk 教程(备忘)
纯手打,转载请注明出处~ 刷机有风险,出现问题概不负责! 本着自娱自乐的宗旨 ,分享一下,出了问题不负责! 准备的材料: 1,手机一枚(废话)国行lg g3 d858 2,root 工具 用来root ...
- 牛客第二场 J farm
White Rabbit has a rectangular farmland of n*m. In each of the grid there is a kind of plant. The pl ...
- 接口的鉴权&响应数据解密
前言: 1.开放的接口为了避免被别人攻击,频繁刷接口,浪费服务器资源,这就涉及到签名(Signature)加密了 2.API 使用签名方法(Signature)对接口进行鉴权(Authenticati ...
- request的响应时间elapsed和超时timeout
前言:requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的 1.获取接口请求的响应时间 r.elapsed.total_seconds() import ...