C和指針 第十章 結構和聯合 (二)

結構體傳值:函數

結構體也是標量,像字符和整數同樣,能夠傳遞給一個函數,可是傳入整個結構體效率很低,能夠傳入指向結構體的指針來提升效率。若是不但願程序對結構體變量改變能夠加入const關鍵詞。spa

typedef struct {
    int id;
    int num;
    char name[100];
} Produts;

//傳入指針,加const修飾,防止程序修改
void test(Produts const *ptr);

位段:指針

結構體能夠實現位段,位段的聲明和結構體類型,可是成員是多個位的字段,不一樣長度的字段儲存在一個或多個整形變量中。位段的類型必須聲明成int,signed,unsigned int 類型,其次,成員名後面時一個冒號,和一個整數,整數指定位段所佔位數目:blog

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

佔32位,對於16位機器來講,size超過了整型長度,因此是不可移植的。位段的長處是節省空間,和對位的操做更方便。內存

聯合union字符串

聯合能夠當作在某個位子上能夠儲存不一樣類型的值,可是隻能儲存一個,聯合的成員引用的是內存中相同的位置,能夠在不一樣時刻,把不一樣的東西存在同一個位置。string

#include <stdio.h>

union {
    float f;
    int    i;
    char * str;
} var;

int main()
{
    var.f = 12.3;
    printf("%g\n", var.f);

    var.i = 111;
    printf("%d\n", var.i);

    var.str = "hello";
    printf("%s\n", var.str);
    return 0;
}

var聯合能夠儲存浮點數,整數和字符串指針,根據不一樣的類型,讀取出不一樣的值。可是聯合一次只能夠儲存一個值,因此在函數中使用時,沒法肯定所儲存的類型,若是和struct一塊兒使用能夠添加一個標示表明所儲存的類型。it

#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\n", variable.value.i); break; case 1: printf("float %g\n", variable.value.f); break; case 2: printf("string %s\n", 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; }

注意:聯合的初始化值必須時第一個成員類型,若是是其餘類型,那麼會發生類型轉換成爲一個整數。io

相關文章
相關標籤/搜索