-
結構體
鎖定
目錄
結構體結構體變量
關鍵字struct和結構體名組合成一種類型標識符,其地位如同通常的int、char等類型標識符,其用途就像 int 類型標識符標識整型變量一樣可以用來定義結構體變量。定義變量以後,該變量就可以像定義的其他變量一樣使用了;成員又稱為成員變量,它是結構體所包含的若干個基本的結構類型,必須用“{}”括起來,並且要以分號結束,每個成員應表明具體的數據類型。
[2]
結構體C語言中的結構體
在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變量、指針或數組等,用以實現較複雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
[3]
結構體定義與聲明
struct tag { member-list } variable-list ;
//此聲明聲明瞭擁有3個成員的結構體,分別為整型的a,字符型的b和雙精度的c //同時又聲明瞭結構體變量s1 //這個結構體並沒有標明其標籤 struct { int a; char b; double c; } s1; //同上聲明瞭擁有3個成員的結構體,分別為整型的a,字符型的b和雙精度的c //結構體的標籤被命名為SIMPLE,沒有聲明變量 struct SIMPLE{ int a; char b; double c; }; //用SIMPLE標籤的結構體,另外聲明瞭變量t1、t2、t3 struct SIMPLE t1, t2[20], *t3; //也可以用typedef創建新類型 typedef struct{ int a; char b; double c; } Simple2; //可以用Simple2作為類型聲明新的結構體變量 Simple2 u1, u2[20], *u3;
//此結構體的聲明包含了其他的結構體 struct COMPLEX{ char string[100]; struct SIMPLE a; }; //此結構體的聲明包含了指向自己類型的指針 struct NODE{ char string[100]; struct NODE *next_node; };
struct B; //對結構體B進行不完整聲明 //結構體A中包含指向結構體B的指針 struct A{ struct B *partner; //other members; }; //結構體B中包含指向結構體A的指針,在A聲明完後,B也隨之進行聲明 struct B{ struct A *partner; //other members; };
結構體結構體作用
結構體結構體的意義
結構體描述了一段內存的解釋意義。在內存中,數據的意義在於如何使用此段數據,如在內存中存有一個數據3,如果只把他當作正整數來使用,那麼其意義為正整數3,如果把內存中的3,當作2的3次方來使用,那麼3的意義則為指數3。而一個結構體則描述了一段內存中的數據的使用意義
[4]
[6]
,如:
typedef struct test { int a; char b; float c; } test_struct; int main() { test_struct new_strcut; new_strcut.a = 1; new_strcut.b = 'b'; new_strcut.c = 3.0; return 0; }
上述代碼,在執行到test_struct new_strcut;這一行時,程序首先會在內存(棧)中要求一塊4 + 1 +4 = 9字節的內存,在內存中的數據,如上文所述,如果不使用是沒有意義的。所以需要人為對這段內存中的數據進行解釋,結構體即是對這段內存的使用意義描述,即:這塊內存的第0到3個字節作為int型數據使用,第4個字節的內存作為char型使用,第5到8個字節作為float使用
[4]
[5]
。
結構體結構體的大小與內存對齊
結構體的大小不是結構體元素單純相加就行的,因為我們主流的計算機使用的都是32bit字長的CPU,對這類型的CPU取4個字節的數要比取一個字節要高效,也更方便。所以在結構體中每個成員的首地址都是4的整數倍的話,取數據元素時就會相對更高效,這就是內存對齊的由來。每個特定平台上的編譯器都有自己的默認“對齊係數”(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的“對齊係數”。
[3]
規則:
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
[3]
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
[3]
結構體C++中的結構體
在C語言中,可以定義結構體類型,將多個相關的變量包裝成為一個整體使用。在結構體中的變量,可以是相同、部分相同,或完全不同的數據類型。在C語言中,結構體不能包含函數。在面向對象的程序設計中,對象具有狀態(屬性)和行為,狀態保存在成員變量中,行為通過成員方法(函數)來實現。C語言中的結構體只能描述一個對象的狀態,不能描述一個對象的行為。在C++中,考慮到C語言到C++語言過渡的連續性,對結構體進行了擴展,C++的結構體可以包含函數,這樣,C++的結構體也具有類的功能,與class不同的是,結構體包含的函數默認為public,而不是private。
[3]
C++控制枱輸出例子:
#include<cstdlib> #include<iostream> //定義結構體 struct point { //包含兩個變量成員 int x; int y; }; using namespace std; int main(int argc,char * argv[]) { point pt;//加上struct的結構體變量定義是C語言的特徵,而C++語言不需要這樣 pt.x=1; pt.y=2; cout<<pt.x<<endl<<pt.y<<endl; return EXIT_SUCCESS; }