设为首页 加入收藏

TOP

C语言基础之结构体讲解
2017-12-23 06:06:51 】 浏览:239
Tags:语言基础 结构 讲解

结构体

结构体是一种数据结构。 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
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言基础(六)(检测程序错误宏.. 下一篇杨辉三角输出代码实例

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目