C 碎片八 结构体&枚举&联合

Posted 感悟人生,体验生活,享受旅途,热爱编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 碎片八 结构体&枚举&联合相关的知识,希望对你有一定的参考价值。

一、结构体

1, 结构体定义

结构体类型的定义:任意数据类型变量的集合,用于描述一个具体的事物的信息。C语言中描述一件事物一般都是用结构体

声明结构体类型的格式: struct  结构体名 {成员列表}; 

一般形式:

//结构体定义一般形式
 struct 结构体名 {
    成员变量1; //成员变量后面是‘;‘
    成员变量2; 
    .... 
};
//这里最后加‘;‘ 不能省略

  

例:

struct Student {
    char name[30]; 
    int age;
    double score;
};

说明:

  1. 先定义一个结构体类型 (结构体类型要先定义再使用)

  2. 上面结构体用于描述一个学生的信息,表示一个学生: 姓名 年龄 分数

  3. 结构体类型一般定义在函数外面

 

2, 结构体变量声明

结构体类型  struct Student . int char long double  int * 等等 都是一样的,都只是一个数据类型而已,声明变量的时候和之前变量声明的格式是一样的

struct Student xiaohong;

说明:定义一个结构体变量,表示一个学生小红

 

3, 结构体访问/操作

//用 ‘.‘操作/访问 结构体变量中的成员
    
//结构体变量名.成员变量名 --->访问指定的成员
    
//访问年龄 对结构体变量xiaofen中age赋值
xiaofen.age = 24;//得到了age 变量名

//对分数赋值
xiaofen.score = 100;//得到了score变量名

//对名字赋值
//xiaofen.name = "xiaofen";
//错误的xiaohong.name 得到了一个数组名 ,数组名是一个常量不能赋值
    
//用字符串拷贝
strcpy(xiaohong.name, "xiaohong");

  

4, 结构体初始化

//结构体的初始化
//结构体变量的初始化 要对里面的每个成员初始化
struct Student xiaohong = {"xiaohong",24,90.0};

 

5, 结构体整体赋值

//结构体变量可以整体赋值
struct Student x;

//把xiaohong 变量里面的所有成员依次赋给 x结构体变量
x = xiaohong;

  

6, 结构体的变种

上面的前三步操作是"先定义结构体类型再定义变量",下面是其他形式:

1. 声明类型的同时定义变量

struct Student {
    char name[30]; 
    int age;
    double score;
}xiaohuang,xiaogang;

说明:定义结构体Student 同时定义了两个struct Student类型的变量xiaohuang,xiaogang。也可以用 struct Student xxx 来定义结构体变量;

 

 

2. 直接定义结构体类型变量

struct {
    char name[30]; 
    int age;
    double score;
}xiaohuang,xiaogang;

说明:区别没有出现结构体名。定义结构体Student 同时定义了两个struct Student类型的变量xiaohuang,xiaogang。不能用 struct Student xxx 来定义结构体变量;

 

7, 结构体指针

结构体也可以有指针类型,叫做结构体指针。定义个结构体指针,指向一个结构体变量就可以用结构体指针来操作这个变量

//定义一个结构体变量xiaohong并初始化
struct Student xiaohong;
xiaohong.age = 24;
xiaohong.score = 100;
strcpy(xiaohong.name, "xiaohong");

//定义一个结构体变量指针变量 指向结构体变量xiaohong
//*p  表示p指向的空间  这里就是结构体变量xiaohong
struct Student * p = &xiaohong;

/*结构体指针操作 修改*/

//.的优先级高于 * : *p是一个整体表示结构体空间,所以要加()
(*p).age = 25;
(*p).score = 120;

//结构体指针 可以用->直接访问结构体成员
p->age = 26;//p->age  就是变量age
p->score = 100;
strcpy(p->name, "xiaohuang");//p->name 就是name数组名

 

8, 结构体类型的说明

1. 类型与变量是不同的概念。我们只能对变量赋值、存取、运算,不能对类型进行操作;编译时,对类型是不分配空间的,只对变量分配空间,不仅适用于结构体,所有数据类型都是如此,包括对象。

2. 对结构体中的成员可以单独使用,使用方法及作用和普通变量是一样一样的

3. 结构体成员可以是结构体类型,在进行操作的时候需要一级一级找到最低的一级的成员(普通类型)

4. 结构体成员可以数组,在初始化的时候需要对数组中的每个元素进行初始化

5. 不能将一个结构体作为一个整体输入输出

6. 结构体可以作为函数参数以及返回值

7. 可以引用结构体成员的地址,也可以引用结构体变量的地址

  &xiaohong.age  表示结构体成员age的地址

  &xiaohong  表示结构体变量的地址

 

二、枚举

//定义了一个枚举类型 enum Sex;

 

enum Sex {

    //枚举常量

    Male,// 后面加 ‘,’

    Female //最后一个成员 可以不加‘,‘

};

//一旦定义 枚举类型 之后 那么enum Sex 类型和里面的Male Female 枚举常量在下面就可以直接使用了,Male 表示的是0 Female表示的是数字1

 

//typedef 重新定义 enum Sex 类型

typedef enum Sex MySex;

 

//描述一个学生  年龄 和性别

typedef struct Student {

    int age;

    //性别

    MySex sex;

}MyStu;

    //枚举的唯一的功能:增强代码的可读性

    

    //枚举常量 实际上就是一些整型数字常量

三、联合

//定义一个联合

union myTest {

    int x;

    char y;

};

//上面的类型大小 就是4  x y 共享同一个空间

 

 

//联合的成员 是共享同一个内存空间,以成员中最大数据类型 作为空间的大小

 

//也可以重新命名

typedef union myTest NewTest;

 

/*

  1004      1003     1002     1001

 |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|

    12        34       56      78

 

 

 存储数据分为 大端存储 小端

 

 //

        字节

 0x12345678

 

 大端:存储数据时,把数据的高字节放在低地址  把低字节放在高地址

 

 小端:存储数据时,把数据的高字节放在高地址  把低字节放在低地址

 

 我们的电脑是小端存储

 

 面试:实现一个函数 证明你的电脑是大端还是小端

 

 

 */

 

四、位字段

以上是关于C 碎片八 结构体&枚举&联合的主要内容,如果未能解决你的问题,请参考以下文章

结构体(一次过)

自定义类型:结构体(内存对齐),枚举,联合

桃猿三结义:结构枚举联合

桃猿三结义:结构枚举联合

C89,C99: C数组&结构体&联合体快速初始化

自定义类型