学习笔记——C语言基本概念&结构体&共用体&枚举——(10)

1、结构体

定义新的数据类型:

数据类型:char short int long float double
数组 指针 结构体

结构体: 新的自己定义的数据类型
格式:


struct 名字{
        成员 1;
        成员 2;
        。 。 。
        成员 n;
        };

举例:

struct Student{
	char name[32];
	int ID;
	float fraction;
};


新的数据类型名: struct 名字

1.2定义方式

1.2.1先定义数据类型,再用数据类型定义变量

第一步: 定义数据类型

struct Stu
{
        char name[32];
        int ID;
        float score;
}; //已经定义好新的数据类型, 叫 struct Stu


        仅仅有数据类型, 不定义变量, 计算机不开辟空间
第二步: 用自己定义的数据类型, 定义变量
                struct Stu per1;
        定义一个变量, 变量名叫 per1, per1 的数据类型 struct Stu 类型; 计算机给 per1 开
辟 sizeof(struct Stu)大小空间。

1.2.2 定义数据类型, 同时用数据类型定义变量

struct Stu
{
        char name[32];
        int ID;
        float score;
}per1; 

        定义一个变量, 变量名叫 per1, per1 的数据类型 struct Stu 类型; 计算机给 per1 开辟
sizeof(struct Stu)大小空间。

1.2.3 无名结构体 ,只能在定义数据类型的同时定义变量

struct
{
char name[32];
int ID;
float score;
}per1;

1.3 结构体取成员

普通变量:
    格式: 变量名.成员
举例:
    struct Stu
    {
        char name[32];
        int ID;
        float score;
    };
    struct Stu per1;

取成员:
per1.name         char [32] %s
per1.ID               int %d
per1.score         float %f

指针变量取成员
格式: 指针变量名->成员;
举例:
    struct Stu
    {
        char name[32];
        int ID;
        float score;
    };
    struct Stu per1; //结构体变量名不是地址
    struct Stu *p = &per1;
    p->name char [32] %s
    p->ID int %d
    p->score float %f

1.4结构体的初始化

1--> 完全初始化 -- 依次赋值
2--> 部分初始化 -- 依次赋值, 未赋值的系统给 0
3--> 只定义变量, 不赋值, 遵循全局变量和局部变量自身的原则
4--> 取成员初始化
5--> 从键盘输入

1.5求结构体大小

方式 1: 计算机运算: sizeof();//括号中写变量名/结构体数据类型
方式 2: 自己运算
第一步: 确定对齐方式-以下三个中的较小者:
        1》 看系统 64 位 8 字节
        2》 看结构体中最大成员的大小( 数组, 看元素)
        3》 #pragma pack(2/4/8) 括号中写几就是几
第二步: 结构体中除第一个成员外, 其他成员距离首地址的偏移量, 必须是对齐方式
或者自身大小中较小者的整数倍!
第三步: 结构体的整体大小, 必须是对齐方式的整数倍!

举例:

struct Stu
{
    int id;
    char ch;
    long num;
}
//第一步:先确定对齐方式,现在使用的计算机基本上都是64位处理系统,对应的也就是8字节。
然后,看结构体中最大成员的大小(数组,看元素),其中结构体中最大的为long类型,8字节。和系统比较取最小,也就是说对齐方式为:8;
第二步:看结构体中除第一个成员外,其他成员距离首地址的偏移量,必须是对齐方式或者自身大小中较小者的整数倍。
ch举例首地址的偏移量是4字节,满足是自身大小的1的整数倍,不需要填充。
num举例首地址的偏移量是5字节,需要对齐方式8或者自身大小的整数倍,那么ch后面要添加三个位
第三步:结构体整体的大小,必须是对齐方式的整数倍,目前是16,满足

2、共用体

关键字:union

定义:所有的成员公用同一块空间

格式:

        union 名字{
                成员 1;
                成员 2;
                ...
                成员 n;
        };
使用方式: 和结构体基本一致。

测试大小端的意义:保证不同设备之间数据传输的准确性。

大小:
        第一步: 确定对齐方式-以下三个中的较小者:
        1》 看系统 64 位 8 字节
        2》 看共用体中最大成员的大小( 数组, 看数据类型)
        第二步: 最大成员, 满足对齐方式的整数倍!

union Tag
{
    int a;
    char buf[5];
};
第一步:操作系统为8位,共用体内最大为int 4位。
确定对齐方式为4
第二步:int 4+char 1=5,必须是对齐方式的整数倍。所以后面要补位加三,整体大小为8

应用:

防治不同设备之间数据传输的准确性。
测试计算机的大小端:
        大端模式:是指数据的高字节保存在内存的低地址中;

        小端模式:是指数据的高字节保存在内存的高地址中;

代码测试:

#include<stdio.h>
union Tag
{
	unsigned int a;
	unsigned char buf[4];
		
};
int main()
{
	/*union Tag text;
	text.a=1;
	if(text.buf[0]==1)
	{
		printf("小端\n");
	}
	else if(text.buf[3]==1)
	{
		printf("大端\n"); 
	}*/
	unsigned int a=1;
	unsigned char *p=(unsigned char*)&a;
	if(*p==1)
	{
		printf("小端\n");
	}
	else if(*(p+3)==1)
	{
		printf("大端\n"); 
	}
	return 0;
}

3、枚举

大小:4字节

const int num1 = 100;
定义: 整型常量的集合;
关键字: enum
一般使用: enum{a,b,c,d,e,f,g};
a: 整型常量, 是 0
b: 整型常量, 是 1
c: 整型常量, 是 2
。 。 。 。 g, 是 6

特殊用法: enum{a,b,c,d=100,e,f,g};
a: 整型常量, 是 0
b: 整型常量, 是 1
c: 整型常量, 是 2
d: 整型常量, 是 100
e: 整型常量, 是 101
f: 整型常量, 是 102
g: 整型常量, 是 103
枚举大小: 和里面具体的个数无关, 固定 4 字节;

typedef: 给数据类型起一个新的名字
格式:
typedef 原来的数据类型 新的名字;
typedef int A; A 就是 int 的别名
A a; //int a;
typedef struct Stu{
...
}STU; STU: 就是 struct Stu 的别名
STU per; // struct Stu per;
typedef struct{
...
}STU; STU 就是结构体数据类型
STU per; //用结构体定义变量叫 per
 

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值