基本概述:
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. UVa LA 3695 - Distant Galaxy 前缀和,状态拆分,动态规划 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  2. bzoj2946

    题解: 和poj1226差不多 把翻转去掉 然后不要忘记开大数组和二分的上限答案 代码: #include<bits/stdc++.h> using namespace std; type ...

  3. Oracle Rman 控制RMAN的备份时间,减少IO消耗

    一.问题描述 由于服务器配置不高,备份策略为周末全备.周一至周六差异备份. 平时服务器CPU使用30%左右. 全备份时,开启两个通道,CPU达到70%-80%左右,业务不卡顿.不掉单,session不 ...

  4. Linux学习: LCD驱动

    一.LCD驱动框架: 1.分配一个fb_info结构体:s3c_lcd = framebuffer_alloc(0,NULL); 2.设置fb_info(s3c_lcd): ID.固定参数.可变参数. ...

  5. UNICODE_STRING(用户模式 内核模式)

    UNICODE_STRING结构: typedef struct  _UNICODE_STRING { USHORT Length;                                   ...

  6. Android开发 ---基本UI组件2:图像按钮、单选按钮监听、多选按钮监听、开关

    Android开发 ---基本UI组件2 1.activity_main.xml 描述: 定义一个按钮 <?xml version="1.0" encoding=" ...

  7. Linux文件系统命令 mkdir/rmdir

    命令名:mkdir 功能:创建一个文件夹,和touch的区别是,touch是创建一个文件,后面可以跟绝对路径和相对路径 eg: mkdir ren 命令名:rmdir 功能:删除一个文件夹

  8. PCP架构设计

    1.引言 现如今已经进入互联网时代,无论是工作还好娱乐都已经离不开互联网,与此同时,网络相关的问题也时不时的侵扰着我们,这需要我们具有一定网络相关知识来解决相关问题,而这时,一款工作便利,免费的网络分 ...

  9. Building Tablet PC Applications ROB JARRETT

    Building Tablet PC Applications ROB JARRETT Tablet PC 开发,有需要PDF的留下邮箱 目录This text was added by using ...

  10. C#窗体换肤

    Form1.cs using System;using System.Collections.Generic;using System.ComponentModel;using System.Data ...