struct結構體詳解

爲何要有結構體
數組

結構體和其餘類型基礎數據類型同樣,例如int類型,char類型 只不過結構體能夠作成你想要的數據類型。以方便往後的使用。ide

在實際項目中,結構體是大量存在的。研發人員常使用結構體來封裝一些屬性來組成新的類型。因爲C語言內部程序比較簡單,研發人員一般使用結構體創造新的「屬性」,其目的是簡化運算。函數


結構體在函數中的做用不是簡便,其最主要的做用就是封裝。封裝的好處就是能夠再次利用。讓使用者沒必要關心這個是什麼,只要根據定義使用就能夠了。spa


C語言中,能夠定義結構體類型,將多個相關的變量包裝成爲一個總體使用。在結構體中的變量,能夠是相同、部分相同,或徹底不一樣的數據類型。在C語言中,結構體不能包含函數。在面向對象的程序設計中,對象具備狀態(屬性)和行爲,狀態保存在成員變量中,行爲經過成員方法(函數)來實現。C語言中的結構體只能描述一個對象的狀態,不能描述一個對象的行爲。在C++中,考慮到C語言到C++語言過渡的連續性,對結構體進行了擴展,C++的結構體能夠包含函數,這樣,C++的結構體也具備類的功能,與class不一樣的是,結構體包含的函數默認爲public,而不是private設計

 

#include<stdio.h>指針

#if 1對象

//複數運算用結構體實現blog

typedef struct complex//a + bi繼承

{遞歸

double real;

double imag;

   //[常見錯誤]

   //struct complex data;//錯誤,遞歸定義

   //struct complex *next;//能夠,自引用,類型是struct complex * 4B

}Complex;


Complex comAdd(Complex first,Complex second)

{

Complex result;                        //變量.成員

result.real = first.real + second.real;//Complex類型變量不可相加,引用成員

result.imag = first.imag + second.imag;

return result;

}

Complex inputCom()

{

   Complex c;

   scanf("%lf%lf",&c.real,&c.imag);

   return c;

}

void echo(Complex c)

{

printf("%g%+gi ",c.real,c.imag);

// "%g" ,意思就是在 "%f" 格式(實型的小數形式)和 "%e" 格式(實型的指數形式)當// 中,選擇比較簡短的表達           方式,而且不顯示小數點後面結尾的一些 0

//"%g%+gi" 若結果爲負沒有用,-1-2i;若結果爲正,虛數應有+號 1+2i,不然是1 2i

}

void main(void)

{

//Complex c1 = {1,2};//對變量的成員初始化{}

//Complex c2 = {3,-4};//運算:同類型賦值,取址(結構體變量佔內存因此有地址)

Complex  c1,c2,c;

printf("輸入複數1: ");

c1 = inputCom();

printf("輸入複數2: ");

c2 = inputCom();

c=comAdd(c1,c2);

echo(c);

putchar(10);//換行

}

#endif


結構體內存對齊

  變量非連續存儲

  • 結構體對齊模數k是結構體數據成員中最大類型的寬度(4),變量長度爲k的最小整數倍  

    變量對齊模數是成員和結構體對其模數的最小值Char 1B,struct 4B 取小


wKiom1Qm0oqQq14UAAA4IDCSAq0586.jpg

wKiom1Qm00yi5mnUAAC9QjvcAYM572.jpg

      8 B                      12B

  • 指定結構體對齊模數:VC 項目---屬性---配置屬性---C++---代碼生成--指定對齊模數

  • 結構體對齊和指定裏最小值

    #pragma pack(2)

      6B                       10B                                                    

    #pragma pack(8)

      8(取其小)                                 12B

 

結構體指針對變量進行訪問

Complex c

Struct *p=&c;

P->real;

p->real.year = 2002;

(*p).real;

數組初始化:

 

C++中的結構體與類的區別

類與結構體在C++中有三點區別。

1class中默認的成員訪問權限是private的,而struct中則是public的。

2)從class繼承默認是private繼承,而從struct繼承默認是public繼承。

3C++的結構體聲明沒必要有struct關鍵字,而C語言的結構體聲明必須帶有關鍵字(使用typedef別名定義除外)。

相關文章
相關標籤/搜索