内容纲要

结构体

结构体是C语言中用于存储不同数据类型的构造数据类型

声明

struct 结构名{
    成员列表
};

定义

  1. 先定义结构体类型后定义变量
struct 结构名{
    成员列表;
};
struct 结构名 结构体变量名;
  1. 定义结构体类型同时定义变量
struct 结构名{
    成员列表;
} 结构体变量名;
  1. 直接定义解耦股体类型变量
struct {
    成员列表;
} 结构体变量名;

结构体

引用

结构体变量名.成员名

如果定义一个结构体指针,使用该指针和结构体名来引用结构体成员

struct{
    成员列表;
} *结构体指针名;
(*结构体指针名).成员名

2.

结构体指针名->成员名

结构体数组

struct 结构名{
    成员列表;
} 结构体数组名[结构体元素个数];

例如:

#include <stdio.h>

struct{
    int age;
} *s, student,students[2];
int main()
{
    s=&student;
    student.age=18;
    students[0].age=16;
    students[1].age=17;
    printf("student.age=%d,s->age=%d,students[0].age=%d,studnets[1].age=%d",student.age,s->age,students[0].age,students[1].age);

    return 0;
}

运行结果:

student.age=18,s->age=18,students[0].age=16,studnets[1].age=17

位域

存储不满足一个字节的数据,要占用几个字节时采用位域的方式来进行存储。位域是把一个字节二进制位划分为几个不同的区域,若当前字节存储不了,可从下一字节开始存储,也可使用空域进行填充,在下一字节处进行存储。

定义:

struct 位域名{
    数据类型 位域成员名:所占字节数;
    位域成员列表.....
}

使用时与普通结构体一致,位域可以通过各种格式进行输出。

#include <stdio.h>

struct bs{
    unsigned int a:8;//0-255 2^8-1
    unsigned int b:2;//0-3 2^2-1
    int :6;//空域,不使用,可用于填充,让下一位域从下一个字节开始
    int c:6;//-32-31
};
int main()
{
    struct bs d, *p;
    d.a=127;
    d.b=3;
    d.c=-33;//数据溢出超过位域的范围,极大值溢出从极小值开始,极小值溢出从极大值开始
    printf("a=%d,b=%d,c=%d",d.a,d.b,d.c);

    return 0;
}

运行结果:

a=127,b=3,c=31

共用体

在一个相同的存储位置存储不同类型的多个值时采用共用体存储。

定义

与结构体的定义引用成员变量方式一样,但是在共用体中只能使用最后一次保存的值,共用体通过覆盖前一成员变量来进行存储,并且在存储过程中与结构体不同。结构体所占用的字节数是其成员变量所占字节数之和,而共用体所占字节数是其成员变量占字节数最大的值。

#include <stdio.h>

union {
    int age;
    char sex;
} student;

int main()
{
    student.age=10;
    student.sex='M';
    printf("student.age=%d,student.sex=%c,sizeof(student)=%d",student.age,student.sex,sizeof(student));
    return 0;
}

运行结果:

student.age=77,student.sex=M,sizeof(student)=4

其中int所占字节数最大为4,所以共用体所占的字节数为4。age成员变量的值为随机数,而sex的值正确,sex覆盖了age的值。

typedef

在C语言中可以使用typedef来给系统定义好的数据类型起别名,可以通过别名来定义自定义变量。

typedef 旧类型名 新类型名
#include <stdio.h>

typedef struct {
    int age;
    char sex;
}STU;

typedef int INTEGER;
typedef char name[10];

int main()
{
    STU student;
    name a;//相当于char a[10];
    return 0;
}

也可以使用宏定义#define来进行宏替换,它是由预处理器进行处理的,而typedef是通过编译器来进行编译的。

最后修改日期: 2020年11月27日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。