在陣列、指標、引用介紹完畢後,今天開始乙個新的模組的學習,結構體。不論是c還是c++都是有結構體的,在專案中結構體也是經常遇到的。我們看一些大神的程式,上來先給你列乙個結構體,哇,瞬間就被征服了,這個人好牛。其實結構體並沒有那麼複雜,作為人工設計的資料型別,結構體是會更加方便的人們對專案的開發和程式的維護。下面我們就來了解一下結構體。
結構體是一種資料型別,但是這種資料型別是構造出來的,像int、char等這樣的資料型別,對於資料的記錄是單一型別的資料,而結構體卻可以將它們融合起來作為一種新的資料型別。就比如說,我想買車,那我去看車的時候就得需要了解這輛車,比如這輛車的牌子,這輛車的**,這輛車的效能,如果說給車的牌子、**、和效能分別分配乙個變數,就會顯得程式太過散亂,不但給閱讀者帶來一種混亂感,在**的後期維護上也是很不方便的。
因此,為了能夠使**更加簡潔明瞭,增加程式**的美感和可閱讀性,讓我們來看一下結構體是啥樣的。
struct car
;
定義好了結構體之後,就會生成乙個新的資料型別,通過該結構體定義的變數成為結構體變數。宣告結構體變數的方式見下:
第一種:定義結構體之後,使用結構體型別宣告;
struct car
; car car1;
第二種:定義結構體的時候直接宣告
struct car
car1;
這兩種方式的宣告都是可以的,car1就是乙個car型別的資料。使用第二種方法進行宣告的時候,可以宣告多個變數,car1,car2,car3....都行的。 如:
struct car
car1, car2, car3;
在得到了結構體變數之後,每乙個結構體變數包含的資料成員都需要進行初始化。對其初始化就需要先了解引用結構體變數成員的方式,針對於結構體變數型別,有兩種引用方式:
一、結構體變數被宣告之後,通過運算子 · 來進行引用;
二、結構體變數是指標變數,通過運算子 -> 來進行引用。
#include#includeusing namespace std;
void main()
car1; //結構體變數
car1.cprice = 10; //初始化開始
car1.cname = "寶馬";
car1.cfunction = 'a';
strcpy_s(car1.cfuel, "汽油");
cout << "汽車的**:" << car1.cprice << endl; //輸出初始化成員結果
cout << "汽車的牌子:" << car1.cname << endl;
cout << "汽車的效能:" << car1.cfunction << endl;
cout << "汽車的用油重量:" << car1.cfuel << endl;
}
#include#includeusing namespace std;
int main()
car1; //結構體變數
car *p_car1; //結構體指標變數
p_car1 = &car1;
p_car1->cprice = 10; //初始化
p_car1->cname = "寶馬";
p_car1->cfunction = 'a';
strcpy_s(p_car1->cfuel, "汽油");
cout << "汽車的**:" << p_car1->cprice << endl;//輸出初始化結果
cout << "汽車的牌子:" << p_car1->cname << endl;
cout << "汽車的效能:" << p_car1->cfunction << endl;
cout << "汽車的用油重量:" << p_car1->cfuel << endl;
}
當我們通過定義結構體形成乙個新的資料型別a之後,這個新的構造資料型別a可以在另外乙個定義的構造資料型別b中宣告其變數。當然,還有一種方法是在結構體內部再定義結構體實現結構體的巢狀。
struct car
; };
struct cfactory
; struct car
;
結構體的巢狀其實很簡單,可以通過乙個例子來學習。
#include#includeusing namespace std;
void main()
; cfactory mycar;
}; car car1;
car1.mycar.c_add = "北京"; //內部結構體變數成員初始化
car1.mycar.c_post = 12345;
car1.mycar.c_num = 888;
car1.cprice = 10; //外部結構體變數成員初始化
car1.cname = "寶馬";
car1.cfunction = 'a';
strcpy_s(car1.cfuel, "汽油");
cout << "內部結構體的結果" << endl;
cout << "我的汽車位址的郵編: " << car1.mycar.c_post << endl;
cout << "我的汽車位址的街道編號: " << car1.mycar.c_num << endl;
cout << endl;
cout << "外部結構體的結果" << endl;
cout << "汽車的**: " << car1.cprice << endl;//輸出初始化結果
cout << "汽車的牌子: " << car1.cname << endl;
cout << "汽車的效能: " << car1.cfunction << endl;
cout << "汽車的用油重量: " << car1.cfuel << endl;
}
執行的結果如圖:
結構體作為一種構造資料型別,同樣的跟占用記憶體的大小分不開關係。結構體的大小我們需要注意:
得到的結構體大小結果要為成員中最大位元組的整數倍。
一般來說,沒有字元對齊要求或者是結構體成員對其單位為1的時候,結構體的大小是其內部各成員大小的和;
但是在結構體成員對齊單位發生改變的時候,結構體的大小也會發生改變。
舉個例子:
#include #includeusing namespace std;
void main()
car1; //結構體變數
cout << sizeof(car1) << endl;
}
執行結果是28,
這是為什麼呢?
首先我們來看成員型別,int整型占用4個位元組,字元陣列cfuel占用20個位元組,char字元型占用1個位元組,這樣累加起來得到的結果不應該是25嗎?其實不然,占用位元組最多的型別為int,占用4個位元組,但是25不可以整除,因此大小肯定不是25,那具體結果為什麼是28呢?我們已經知道了在這個結構體中int是佔位元組數最大的資料型別,因此int之後的資料型別都以4個位元組為準,位元組數不夠的,填補空白位。占用空間的結果應該是這樣的:
在加上字元陣列佔的20個位元組,因此一共是28個位元組。
但是如果再加上乙個char型別的資料的話,得到的大小仍然是28,
這是因為新的char型別的資料填補在第乙個char後面的位置。占用空間的結果是這樣的:
因此還是占用28個位元組。
結構體的介紹到此結束,希望對大家有些幫助!
結構體學習1
include include include using namespace std void strudefine stu printf name s,c,age d,sorce lf,addr s stu.name,stu.stu.age,stu.sorce,stu.addr printf n...
結構體基礎
什麼是結構體?簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構...
結構體 基礎
一 結構是什麼?結構體是一種可以儲存多個資料的集合,像陣列一樣,你可以把多個資料儲存到乙個變數裡,但與陣列不同的是,結構體中的成員 和陣列元素一樣,在結構體中我們稱之為成員 可以是不同型別的。結構體和陣列比較 1 陣列中所有元素的型別相同,但結構體允許不同 2 陣列通過 陣列名 下標 或者指標來訪問...