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

C语言基础之结构体讲解

程序员文章站 2022-03-23 19:36:44
结构体 结构体是一种数据结构。 int 、float等是基本数据结构。 数组也是一种数据结构,但是数组存放的数据类型比较单一,结构体解决了数组里不能存放多种类型数据的这种缺陷。...
结构体

结构体是一种数据结构。 int 、float等是基本数据结构。 数组也是一种数据结构,但是数组存放的数据类型比较单一,结构体解决了数组里不能存放多种类型数据的这种缺陷。

1、结构体的声名

声名时,不占空间,只是声名了一种数据类型,定义时才分配空间

// struct声名结构体是必须有,infor是该种结构体的类型名,可自定义。
    struct infor
    {
        char a[10];  
        float b;
        int c;
    };
2、结构体的变量定义
    struct infor stu;             //定义时也要有struct。

    struct infor2
    {
        char a[5];  
        float b;
        int c;
    }a, b[3], *c;                //可以在声明的同时定义变量。


//声名结构体时没有名字,声名之后无法调用,只能声名的同时定义变量,但编译时不会报错。
    struct 
    {
        int a;
        float b;
        char c;
    }s;


//可以用typedef重命名类型以方便定义变量
//在声明时使用typdef,不写变量名也可使用
    typedef struct
    {
        int a;
        float b;
        char c;
    }S, *p_S;
//S是该类型结构体的新类型名,p_S是指向该类型变量的指针的类型名
    S a;
    p_S p;
3、结构体变量的初始化
struct infor
{
    char a[50];  
    char b;
    int c;
}; 
struct infor s1 = {"abc", 1}; 
//初始化时按成员顺序赋值,不完全初始化时补0.
//a[0] = 'a', a[1] = 'b', a[2] = 'c', 其余为0;

struct infor s2 = {.a="qew", .b=15}; //单独初始化
struct infor s3 = {.a=27, .a="qew"}; //单独初始化时,后者可以将前者覆盖。
struct infor *p_s = &s1;
4、结构体成员的赋值及调用

普通结构体变量取成员用 ‘.’ 运算符。 结构体指针取成员需要用 ‘->’ 运算符(类似于解引用)。

    struct infor
    {
        char a[50];  
        char b;
        int c;
    }; 
    struct infor s1 = {"abc", 1}; 
    struct infor s2 = {.a=27, .a="qew"};
    struct infor *p_s = &s1;



//初始化之后赋值就必须对成员单独一一赋值了。
    s1.b = 18;
    p_stu -> c = 16;
5、结构体的内存对齐原则

结构体的起始地址默认为4的整数倍,当结构体内 占内存最多的成员 所占字节数size小于4时,起始地址为size的整数倍

即结构体内占内存最大的成员是short时,

起始地址为2的整数倍(2<4,所以取2)。 结构体内占内存最大的成员是double时,

起始地址为4的整数倍(8>4,所以取默认值4)。 各成员的首地址均为自身所占内存的整数倍,所以就有了内存补齐原则

struct str1         // 7个字节有效数据
{
    int a;          // 4,int类型从地址是4的倍数处开始存储
    char b;         // 1
                    // 1  填充了1字节空间
    short c;        // 2,short类型从地址是2的倍数处开始存储
}s1;                // 8

struct str2
{
    char a;         // 1
    char b;         // 1
                    // + 2  填充了2字节空间
    int c;          // 4
}s2;                // 8

struct str3         // 6
{
    int a;
    char b;
    char c;
                    // + 2 填充了2字节空间
}s3;                // 8

struct str4         // 10
{
    struct str1 s;  // 8
    char a;         // 1 + 3 填充了3字节空间,因为struct str1中有int类型,所以要补齐4个字节。
}s4;                // 12

struct str5         // 10
{
    short a[4];     // 8
    char b;         // 1 + 1 填充了1字节空间       
}s4;                // 10