• C++学习(二十五)(C语言部分)之 结构体2


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

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

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

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

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

    案例测试代码如下:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<windows.h>
      4 
      5 #pragma warning(disable:4996)//解决在vs2013中strcpy出错,原因是strcpy安全性太低 vs弃用了 改成了strcpy_s
      6 
      7 struct People
      8 {
      9     char name[20];
     10     char sex[5];
     11     int age;
     12 };  //结构体的声明
     13     //  .c是c语言文件   .cpp是c++文件 在c++中结构体使用的时候是可以省去struct
     14 
     15 struct P
     16 {
     17     int a;
     18     double b;
     19     char c;
     20 }pe,*ppe;
     21 //typedef  用来给数据类型起别名
     22 //pe --->struct p
     23 //*ppe   ----->struct p*
     24 
     25 //typedef int[5] INT_ARR_5; //定义一个数组的别名  该种定义的方式是错误的
     26 //typedef int INT_ARR_5[5];//要这样定义
     27 
     28 typedef int INT_ARR_5 [2];
     29 typedef int(*p)(int, int);  //函数指针的别名,名字就是p int(*)(int,int);是一个函数指针
     30 typedef int(*pArr)[5];
     31 
     32 int MySwap(int a, int b)
     33 {
     34     printf("交换函数:
    ");
     35     return 0;
     36 }
     37 
     38 struct LvLiYu  //位域 为了节省内存空间 用多少给多少
     39 {
     40     int a : 1; //4字节 32位  只拿了32位(包括符号位的)中的一位用来存储a  二进制位
     41     int b : 8;//8位
     42     int c : 10;//10位
     43     int d : 5;//5位
     44     int e : 1;//1位    都是按位存储  
     45 };
     46 
     47 
     48 int main()
     49 {
     50 #if 0
     51     struct People PangQi;  //定义了一个自定义的变量 PangQi
     52     PangQi.age = 20;
     53     //PangQi.name = pangqi;  //该种描述的方式是错误的  原因是数组名是一个地址,所以用一个常量来等于一个地址是错误的
     54     //所以要用字符串拷贝函数
     55     strcpy_s(PangQi.sex, "");
     56     strcpy_s(PangQi.name, "艾迪");
     57     printf("姓名:%s	性别:%s	年龄:%d	
    ", PangQi.name, PangQi.sex, PangQi.age);
     58 #endif
     59 
     60 #if 0
     61     //该案例存在缓冲区残留写入的bug,在输入年龄的时候如果字符过长会直接跳过第二个学生的姓名输入
     62     //解决方法  在数据输入循环中加入一句清空缓存取得命令  fflush(stdin);
     63     struct People Student[3];
     64     for (int i = 0; i < 3; i++)
     65     {
     66         printf("请输入第%d个同学的姓名:",i+1);
     67         scanf("%s", Student[i].name);
     68 
     69         printf("请输入第%d个同学的性别:", i + 1);
     70         scanf("%s", Student[i].sex);
     71 
     72         printf("请输入第%d个同学的年龄:", i + 1);
     73         scanf("%d", &Student[i].age);
     74 
     75         fflush(stdin);  //清空输入流缓冲区
     76     }
     77     printf("姓名		性别		年龄		
    ");
     78     for (int i = 0; i < 3; i++)
     79     {
     80         printf("%s		%s		%d
    ", Student[i].name,Student[i].sex,Student[i].age);
     81     }
     82     
     83 #endif
     84 
     85 //    printf("%d",sizeof(struct P));//结构体的对齐与补齐
     86 
     87     //typedef int age;
     88    // age age= 58;//别名
     89 
     90 #if 0
     91     INT_ARR_5 a;
     92     for (int i = 0; i < 5; i++)
     93     {
     94         a[i] = i + 1;  //这里说明a是一个数组 应为我们在前面定义了提个int型的数组别名INT_ARR_5
     95     }
     96     int b;//这里我们定义b是一个整型变量 并不是一个数组
     97     b[0];//所以此处会显示错误
     98 #endif
     99 
    100 #if 0
    101     INT_ARR_5 a[3];  //这种形式就表示一个二维数组 等价于int a[3][5]
    102     for (int i; i < 3; i++)
    103     {
    104         for (int j; j < 5; j++)
    105         {
    106             scanf("%d",&a[i][j]);
    107         }
    108     }
    109 #endif
    110 
    111 #if 0
    112     p Yu; //定义函数指针的变量
    113     Yu = MySwap;  //函数指针的变量保存函数地址
    114     Yu(1, 2);
    115 #endif
    116 
    117 #if 0
    118     int Arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
    119     pArr p;
    120     p = Arr;  //p 指向Arr[0]  p+1指向Arr[1]
    121     printf("%d", **(p + 1));
    122 #endif
    123 
    124 #if 0
    125     printf("%d
    ", sizeof(struct LvLiYu));
    126     struct LvLiYu HongLiYu;
    127     HongLiYu.a = 1;
    128     printf("%d
    ", HongLiYu.a);
    129 #endif
    130 
    131     getchar();
    132     return 0;
    133 }

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

    2019-03-26  09:23:34

  • 相关阅读:
    数据结构与算法(一)--数组
    Lucene学习
    java虚拟机面试题(JVM)
    Java开发面试题归类( 题目篇)
    java虚拟机学习(六)
    java虚拟机学习(五)--垃圾收集器总结
    21_异常_第21天(异常、企业面试题,思维导图下载)
    20_集合_第20天(Map、可变参数、Collections)
    19_集合_第19天(List、Set)
    18_集合框架_第18天(集合、Iterator迭代器、增强for循环 、泛型)
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/10598158.html
Copyright © 2020-2023  润新知