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 ...
随机推荐
- 通过AssemblyResolve事件打包合并exe和dll文件
使用WPF开发的安装包,在创建快捷方式的时候,需要用到COM程序集Windows Script Host Object Model,引用COM程序集后,会在debug目录生成Interop.IWshR ...
- Gameobject.Find和Transform.Find应用区别
using UnityEngine;using System.Collections; public class test : MonoBehaviour{ private GameObject ro ...
- hibernate创建构架
创建hibernate架构: 注意:需要将所需的架包导进去: 二:Java工程的具体结构: 具体代码如下:hibernate.cfg.xml <!DOCTYPE hibernate-config ...
- JAVA⑤
1.定义一个常量 * * 01.一旦被赋予初始值 不允许被改变 * 02.常量名全大写 * 03.如果有多个单词,每个单词使用_ 分割 2. == : * 01. 数值类型 使用的时候 比较的是 值 ...
- 1.4socket服务器打印信息的四种不同方式()
方式一 socker 服务器 # -*- coding: utf-8 -*- import sys,os,multiprocessing from socket import * serverHost ...
- c#dataGridView 知识
一.单元格内容的操作 // 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index Conso ...
- Alpha冲刺3
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/9971198.html 作业博客:https://edu.cnblogs.com/campus/ ...
- L316 波音737Max 危机
Boeing Scrambles To Restore Faith In Its 737 MAX Airplane After Crashes In the wake of two deadly cr ...
- L295 how to turn down a job but keep a good relationship with the hiring manager
Let’s say you’re on the hunt for a new job. Three interviews in, you realize it’s not the place for ...
- Qt 查询字符串数据
(1)函数QString::startsWith(),判断某一个字符串是否以某个字符串开头:该函数具有两个参数,第一个参数制定了一个字符串,第二个参数指定是否大小写敏感,默认大小写敏感: eg: QS ...