C語言之結構體、聯合體

結構體spa

  1,結構體即爲多個基本數據類型組合而成的數據類型。結構體本質上同int等同樣同爲數據類型,能夠定義變量,內部成員不能直接賦值。code

struct Man
{
    int age = 30;
    int score = 80;
};

    上面是錯誤的。正確寫法以下:blog

struct Man
{
    int age; //這樣就行了
    int score;
};

int main()
{
   struct Man man1 = {30,80};
}

  2,結構體常同typedef類型重命名一同使用,以下:內存

typedef struct Man
{
    int age; //這樣就行了
    int score;
}MAN;

int main()
{
   MAN man1 = {30,80};
}

  3,結構體內存對齊io

typedef struct Man
{
    char age; //這樣就行了
    int score;
}MAN;

int main()
{
    printf("%d",sizeof(MAN));
}

  以上代碼輸出的值爲8,而不是直觀意義上的5,這是由於結構體中的成員是對齊的,這裏按4字節對齊。當CPU訪問正確對齊的數據時,它的運行效率最高,數據對齊不是內存結構的一部分,而是CPU結構的一部分。class

  結構體成員對齊是按照類型大小對齊的,而結構體按照長度最大的類型對齊。如成員中char按1字節對齊,short按2字節對齊,int按照4字節對齊等,這裏的結構體成員最長的是int爲4字節,因此這個結構體按照4字節對齊。效率

   

聯合體變量

   1,聯合體本質上爲不一樣數據類型共享存儲空間,此空間要大到足夠容納最"寬"的成員。它的全部成員相對於基地址的偏移量都爲0。數據類型

union U
{
    char s[9];
    int n;
    double d;
};

   2,聯合體一般與結構體共用,經過不一樣方式給變量賦值。nio

union REG
{
   struct
   {
      unsigned short a;
      unsigned short b;   
   } H; 
  unsigned
int R;
} Reg;

  上面能夠經過Reg.R給變量賦值,也能夠分別經過Reg.H.a、Reg.H.b分別賦值,要注意字節序。

相關文章
相關標籤/搜索