码迷,mamicode.com
首页 > 编程语言 > 详细

C语言 结构体

时间:2016-03-07 16:52:00      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

//结构体

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//结构体是一种构造数据类型,用途把不同的数据组合成一个整体
//结构体变量数据大,作为参数的时候一般会使用结构体指针传参


//结构体类型不分配内存,不能赋值,存取,运算
struct nameinfo{
    int num;
    char name[40];
}d1,d2[9],*d3;//结构体的定义①

//匿名结构体,用于限制该结构体的数量,只给某些有权限的使用
struct {
    int snum;
    char sname[40];
}sd1;//匿名结构体,必须在定义的时候就创建变量,其他条件下无法创建

struct mao{
    char ch;
    int a[10];
};

struct gou{
    int num;
    char name[10];
};

struct lang{
    int num;
    double longnum;
    char name[10];
};

void main9(){
    //结构体的定义②
    struct nameinfo info;
    //结构体赋值
    info.num = 1;
    strcpy(info.name, "小米");//数组不可以直接赋值
    printf("结构体的成员变量num=%d,name=%s\n", info.num, info.name);
    //结构体赋值②
    struct nameinfo d4 = { 2, "华为" };
    //注意:结构体变量用大括号赋值,只有在创建并初始化的时候才可以
    //d1 = { 2, "华为" };  错误 不可如此赋值


    //结构体指针
    struct nameinfo *p = NULL;
    //结构体指针的初始化①
    p = &info;
    p->num = 2;//结构体指针的赋值
    strcpy((*p).name, "雷云");
    printf("结构体的成员变量num=%d,name=%s\n", (*p).num, p->name);
    //结构体指针的初始化②
    struct nameinfo *p1 = NULL;
    p1 = (struct nameinfo *)malloc(sizeof(struct nameinfo));
    p1->num = 3;
    strcpy((*p1).name, "马化腾");
    printf("结构体的成员变量num=%d,name=%s\n", (*p1).num, p1->name);


    //结构体字节对齐原则
    //结构体变量占据的内存单元的个数应大于或者等于是其内部所有数据成员占据内存单元数的和。
    //出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则:
    //  (1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
    //  (2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
    //  (3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
    //字节对齐第3条准则提及最宽基本类型的概念,所谓基本类型是指像char、short、int、float、double这样的内置数据类型。
    //“数据宽度”就是指其sizeof的大小。诸如结构体、共用体和数组等都不是基本数据类型

    //简单总结:结构体大小必须包含所有的成员数据,并且可以整除最宽基本类型成员

    //事例
    //对于struct mao,最宽基本类型成员是int,占4个字节,
    //根据结构体字节对齐原则,必须是最宽基本类型成员的倍数
    /*struct mao{
        char ch;//char原本是1个字节,但是都要被最宽基本类型成员int整除,所以此时ch所占的大小是4
        int a[10];//数组不是基本类型,但是他的大小也必须被最宽基本类型成员int整除,
                  //数组a原始大小就是sizeof(int)*10 =40个字节,本来就可以被4整除,所以不用变化
    };*/

    //所以struct mao的大小是 4(char) + 40(int [10]) =44个字节

    //对于struct gou,最宽基本类型成员是int,占4个字节,
    /*struct gou{
        int num;  //int原来是4个字节,正好被4整除,不用填充字节,还是4字节
        char name[10];//数组name原来是sizeof(char)*10 = 10个字节,10不是4的倍数,10距离4的倍数最近的是12
                     //所以数组name的大小是12个字节
    };*/
    //所以struct mao的大小是4(int) + 12(char [10]) = 16个字节

    //对于struct lang,最宽基本类型成员是double,占8个字节,
    /*struct lang{
        int num;//int原本4个字节,但是都要被最宽基本类型成员double整除,所以此时ch所占的大小是8
        double longnum;//double正好被double整除,不用填充字节
        char name[10];//数组name原来是sizeof(char)*10 = 10个字节,10不是8的倍数,10距离4的倍数最近的是16
                    //所以数组name的大小是16个字节
    };*/
    //所以struct lang的大小是8(int) + 8(double) + 16(char [10]) = 32个字节
    printf("结构体mao的大小是%d\n", sizeof(struct mao));
    printf("结构体gou的大小是%d\n", sizeof(struct gou));
    printf("结构体lang的大小是%d\n", sizeof(struct lang));


    system("pause");
}

技术分享

C语言 结构体

标签:

原文地址:http://www.cnblogs.com/zhanggaofeng/p/5250629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!