欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-08 19:09:06
基本概述: int double char; 定义一个学生类型 int Student 姓名 性别 年龄 简单地说 结构体是一个可以包含不同类型的结构,他是一个自定义的类型。 struct 结构体标识符{成员变量;}; struct 是系统关键字,用来说明当前定义了一个自定义类型 结构体标识符 为了 ......

基本概述:
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("交换函数:\n");
 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\t性别:%s\t年龄:%d\t\n", 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("姓名\t\t性别\t\t年龄\t\t\n");
 78     for (int i = 0; i < 3; i++)
 79     {
 80         printf("%s\t\t%s\t\t%d\n", 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\n", sizeof(struct lvliyu));
126     struct lvliyu hongliyu;
127     hongliyu.a = 1;
128     printf("%d\n", hongliyu.a);
129 #endif
130 
131     getchar();
132     return 0;
133 }

 

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

 

2019-03-26  09:23:34