zoukankan      html  css  js  c++  java
  • C和指针 第十章 结构和联合 (二)

    结构体传值:

    结构体也是标量,像字符和整数一样,可以传递给一个函数,但是传入整个结构体效率很低,可以传入指向结构体的指针来提高效率。如果不希望程序对结构体变量改变可以加入const关键词。

    typedef struct {
        int id;
        int num;
        char name[100];
    } Produts;
    
    //传入指针,加const修饰,防止程序修改
    void test(Produts const *ptr);
    

    位段:

    结构体可以实现位段,位段的声明和结构体类型,但是成员是多个位的字段,不同长度的字段储存在一个或多个整形变量中。位段的类型必须声明成int,signed,unsigned int 类型,其次,成员名后面时一个冒号,和一个整数,整数指定位段所占位数目:

    struct CHAR {
        unsigned ch     : 7;
        unsigned font   : 6;
        unsigned size   : 19;
    };
    

    占32位,对于16位机器来说,size超过了整型长度,所以是不可移植的。位段的长处是节省空间,和对位的操作更方便。

    联合union

    联合可以看成在某个位子上可以储存不同类型的值,但是只能储存一个,联合的成员引用的是内存中相同的位置,可以在不同时刻,把不同的东西存在同一个位置。

    #include <stdio.h>
    
    union {
        float f;
        int    i;
        char * str;
    } var;
    
    int main()
    {
        var.f = 12.3;
        printf("%g
    ", var.f);
    
        var.i = 111;
        printf("%d
    ", var.i);
    
        var.str = "hello";
        printf("%s
    ", var.str);
        return 0;
    }
    

    var联合可以储存浮点数,整数和字符串指针,根据不同的类型,读取出不同的值。但是联合一次只可以储存一个值,所以在函数中使用时,无法确定所储存的类型,如果和struct一起使用可以添加一个标示代表所储存的类型。

    #include <stdio.h>
    //类型var可以放整数,浮点,字符串指针。
    typedef struct {
        enum {INT, FLOAT, STRING} type;
        union {
            int    i;
            float f;
            char * str;
        } value;
    } var;
    //根据类型读取值 void checkVar(var variable) { switch(variable.type){ case 0: printf("int %d ", variable.value.i); break; case 1: printf("float %g ", variable.value.f); break; case 2: printf("string %s ", variable.value.str); break; default: printf("not valid type"); break; } }
    int main() { var variable1; variable1.type = 0; variable1.value.i = 11; checkVar(variable1); variable1.type = 1; variable1.value.f = 11.11; checkVar(variable1); variable1.type = 2; variable1.value.str = "yangxunwu"; checkVar(variable1); return 0; }

    注意:联合的初始化值必须时第一个成员类型,如果是其他类型,那么会发生类型转换成为一个整数。

  • 相关阅读:
    学习Python的一些Tips
    读书笔记《深入理解计算机系统》(第三版) 第二章 信息的表示
    读书笔记《深入理解计算机系统》(第三版) 第一章 计算机系统漫游
    C 标准库系列之locale.h
    C 标准库系列之limits.h
    C 标准库系列之float.h
    C 标准库系列之errno.h
    C 标准库系列之ctype.h
    C 标准库系列之assert.h
    C 标准库系列之概述
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/5831860.html
Copyright © 2011-2022 走看看