爲何要有結構體
數組
結構體和其餘類型基礎數據類型同樣,例如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 取小
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++中有三點區別。
(1)class中默認的成員訪問權限是private的,而struct中則是public的。
(2)從class繼承默認是private繼承,而從struct繼承默認是public繼承。
(3)C++的結構體聲明沒必要有struct關鍵字,而C語言的結構體聲明必須帶有關鍵字(使用typedef別名定義除外)。