什麼是結構體?
簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有 兩點不同,首先結構體可以 在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 (而結構體是),陣列名稱是常量指標,所以不可以做為左值進行運算,所以陣列之間就不能通過陣列名稱相互複製了,即使資料型別和陣列大小完全相同。
定義結構體使用struct修飾符,例如:
struct test
float a;
int b;
上面的**就定義了乙個名為test的結構體,它的資料型別就是test,它包含兩個成員a和b,成員a的資料型別為浮點型,成員b的資料型別為整型。
由於結構體本身就是自定義的資料型別,定義結構體變數的方法和定義普通變數的方法一樣。
test pn1;
這樣就定義了一test結構體資料型別的結構體變數pn1,結構體成員的訪問通過點操作符進行,pn1.a=10 就對結構體變數pn1的成員a進行了賦值操作。
注意:結構體生命的時候本身不占用任何記憶體空間,只有當你用你定義的結構體型別定義結構體變數的時候計算機才會分配記憶體。
結構體,同樣是可以定義指標的,那麼結構體指標就叫做結構指標。
結構指標通過->符號來訪問成員,下面我們就以上所說的看乙個完整的例子:
#include
#include
using namespace std;
struct test//定義乙個名為test的結構體
int a;//定義結構體成員a
int b;//定義結構體成員b
void main()
test pn1;//定義結構體變數pn1
test pn2;//定義結構體變數pn2
pn2.a=10;//通過成員操作符.給結構體變數pn2中的成員a賦值
pn2.b=3;//通過成員操作符.給結構體變數pn2中的成員b賦值
pn1=pn2;//把pn2中所有的成員值複製給具有相同結構的結構體變數pn1
coutpoint=&pn2;//指標指向結構體變數pn2的記憶體位址
couta=99;//通過結構指標修改結構體變數pn2成員a的值
cout總之,結構體可以描述陣列不能夠清晰描述的結構,它具有陣列所不具備的一些功能特性。
下面我們來看一下,結構體變數是如何作為函式引數進行傳遞的。
#include
#include
using namespace std;
struct test
char name;
float socre;
void print_score(test pn)//以結構變數進行傳遞
coutcouttest a=,};
int num = sizeof(a)/sizeof(test);
for(int i=0;iprint_score(a[i]);
for(int i=0;iprint_score(&a[i]);
cin.get();
void print_score(test *pn)的效率是要高過void print_score(test pn)的,因為直接記憶體操作避免了棧空間開闢結構變數空間需求,節省記憶體。
下面我們再說一下,傳遞結構引用的例子。
利用引用傳遞的好處很多,它的效率和指標相差無幾,但引用的操作方式和值傳遞幾乎一樣,種種優勢都說明善用引用可以做到程式的易讀和易操作,它的優勢尤其在結構和大的時候,避免傳遞結構變數很大的值,節省記憶體,提高效率。
#include
#include
using namespace std;
struct test
char name;
float socre;
void print_score(test &pn)//以結構變數進行傳遞
couttest a=,};
int num = sizeof(a)/sizeof(test);
for(int i=0;iprint_score(a[i]);
cin.get();
上面我們說明了易用引用對結構體進行操作的優勢,下面我們重點對比兩個例程,進一部分析關於效率的問題。
//-------------------------------------例程1---------------------------------
#include
#include
using namespace std;
struct test
char name;
float socre;
void print_score(test &pn)
couttest pn;
cin>>pn.name>>pn.socre;
return pn;
void main()
test a;
int num = sizeof(a)/sizeof(test);
for(int i=0;ia[i]=get_score();
cin.get();
for(int i=0;iprint_score(a[i]);
cin.get();
//-------------------------------------例程2---------------------------------
#include
#include
using namespace std;
struct test
char name;
float socre;
void print_score(test &pn)
coutcin>>pn.name>>pn.socre;
void main()
test a;
int num = sizeof(a)/sizeof(test);
for(int i=0;iget_score(a[i]);
cin.get();
for(int i=0;iprint_score(a[i]);
cin.get();
例程2的效率要遠高過例程1的原因主要有以下兩處:
第一:例程1中的
test get_score()
test pn;
cin>>pn.name>>pn.socre;
return pn;
呼叫的時候在內部要在棧空間開闢乙個名為pn的結構體變數,程式pn的時候又再次在棧記憶體空間內自動生成了乙個臨時結構體變數temp,在前面的教程中我們已經說過,它是乙個copy,而例程2中的: void get_score(test &pn)
cin>>pn.name>>pn.socre;
卻沒有這一過程,不開闢任何新的記憶體空間,也沒有任何臨時變數的生成。
第二:例程1在mian()中,必須對返回的結構體變數進行一次結構體變數與結構體變數直接的相互賦值操作。 for(int i=0;ia[i]=get_score();
而例程2中由於是通過記憶體位址直接操作,所以完全沒有這一過程,提高了效率。 for(int i=0;iget_score(a[i]);
函式也是可以返回結構體應用的,例子如下:
#include
#include
using namespace std;
struct test
char name;
float socre;
test a;
test &get_score(test &pn)
cin>>pn.name>>pn.socre;
return pn;
void print_score(test &pn)
couttest &sp=get_score(a);
cin.get();
cout呼叫get_score(a);結束並返回的時候,函式內部沒有臨時變數的產生,返回直接吧全域性結構變數a的記憶體位址賦予結構引用sp
最後提一下指標的引用
定義指標的引用方法如下:
void main()
pn就是乙個指向指標的引用,它也可以看做是指標別名,總之使用引用要特別注意它的特性,它的操作是和普通指標一樣的,在函式中對全域性指標的引用操作要十分小心,避免破壞全域性指標!
C C 中結構體 struct
c 裡面struct可以new,另外 c 中,struct關鍵字與class關鍵字基本是一樣的,但是,有兩點不同 1 struct定義的資料型別裡面所有成員預設級別都是共有的,而class裡面所有成員預設級別都是私有的 2 在模板定義中,只能用class 或者typename 而不能用struct提...
C C 結構體struct的不同
參考 c中 struct student才相當於乙個資料型別 struct student stu struct student是結構體型別 stu是變數,等價於struct student stu typedef struct student stu stu和struct student都是結構型...
C C 結構體 struct 對齊問題
以前只記得結構體對齊,是對齊最長的那個成員,但現在發現並不是這樣,看以下兩個示例 64位 g 9.3.0 編譯 class b 8 static int c 0 static int d 0 static int f 0 cout 值得一提的是靜態成員不佔空間 這裡虛指標 8b,char b 1b。...