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 ...
随机推荐
- day4-python基础-运算符
本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算符: 算术运算符 ...
- bluemix部署(一)简单测试,搭建样本flask程序。
1.注册bluemix 这个略 2.登录bluemix 这个也略 3.创建组织 这个确实是和我们的思想不一样.要创建组织.为什么呢?国内的很多服务都没见过组织这个概念.貌似神符合一个中国人是条龙,十个 ...
- Oracle与MySQL的SQL语句区别
2 表 2.1 创建表(同) create table tableName( columnName1 int, columnName2 int ) 2.2 删除表(异) MySQL: drop tab ...
- Cracking The Coding Interview 4.6
//原文: // // Design an algorithm and write code to find the first common ancestor of two nodes in a b ...
- SWAP 简介
swap 交换分区,是存放在内存当中的临时数据(断电数据丢失) SWAP作用:当内存不足时会导致系统挂了,SWAP就是起到一个临时内存的作用,当内存不足时SWAP充当临时内存,防止系统挂掉
- AOP 实现请求参数打印
1.编写打印方法 import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import org.aspe ...
- SharePoint Framework 构建你的第一个web部件(一)
博客地址:http://blog.csdn.net/FoxDave SharePoint客户端web部件是出现在SharePoint页面的控件,但却是在浏览器本地运行的.他们是SharePoint ...
- jmeter中添加压力机
在压测的时候,可能并发比较大,一台机子已经启动不了那么多并发了,这个时候就是有多台机子一起来并发,就要添加压力机 如何添加压力机呢: 1.其他电脑上也安装了jmeter,和其他电脑都能ping通当前电 ...
- 使用std::map和std::list存放数据,消耗内存比实际数据大得多
使用std::map和std::list存放数据,消耗内存比实际数据大得多 场景:项目中需要存储一个结构,如下程序段中TEST_DATA_STRU,结构占24B.但是使用代码中的std::list&l ...
- base64encode 编码原理
Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...