結構在我們的編程中是非常重要的,比如假設我們要編程來存儲 斯蒂芬_庫裡(我喜歡的籃球明星)的姓名、工資、身高、體重、平均分、三分(他三分簡直爆炸)、命中率、助攻次數等等。希望能有一種數據格式可以將這些信息存儲在一個單元中。沒用過結構體的同學(就像很久以前的我)可能會第一個想到數組。但是我會告訴你數組不能完成這項任務,因為雖然數組可以存儲多個元素。但是所有的元素的類型必須相同。也就是說。一個數組可以存放20個int。另一個數組可以存放15個float,但是同一個數組不能在一些元素中存放int,另一些元素存放float。所以數組在面對這類問題時就顯然效率低也很不方便
C++中的結構就能夠很好的滿足這種需求(存放籃球隊員的信息)。結構是一個比數組更靈活的數據格式,因為同一個結構可以存儲多種類型的數據,這使得能夠將有關庫裡的(籃球運動員)信息存放在一個結構中,從而將數據的表示合並到一起。如果要存儲整個(勇士)隊的信息。。那麼我們可以使用結構數組。每個數組元素都是一個結構都可以存放一名成員。
結構是用戶定義的類型,而結構聲明定義了這種類型的數據屬性。定義了類型後,便可以創建這種類型的變量。所以,定義結構分為兩步,首先定義結構描述,然後按描述創建結構變量(結構數據對象)如下
struct inflatable //該結構的名稱為inflatable
{
char name[20]; //結構成員name
int age; //..
float volume; //..
double price; //..
}; //注意分號一定不可以丟
關鍵字struct表明,這些代碼定義的是一個結構的布局。標示符inflatable是這種數據格式的名稱。這樣便可以向創建int、char類的變量那樣創建inflatable類型的變量了。接下來的大括號裡包含的是結構存儲的數據類型的列表,其中每個列表項都是一條聲明語句。上面的結構有4個結構成員,類型各不相同。
創建結構的變量(相當於拿著模板去往球員身上套)
舉個小栗子
inflatable kuli;
inflatable dawei;
//使用過C語言的會發現在C語言中創建結構變量是這樣的
struct inflatable kuli;
//其實C++允許在聲明結構變量的時省略關鍵字struct
//在C++中,結構標記的用法與基本類型名相同,這種變化強調的是,結構聲明定義了一種新類型
由於kuli的類型是inflatable, 因此可以使用成員操作符(.)來訪問各個成員。例如kuli.name指的是結構的name成員。kuli.price指的是price成員。同樣的dawei.price是dawei變量的price成員。總之,通過成員名能夠訪問結構的成員,就像通過索引一樣能夠訪問數組一樣。
下面我們看一下在程序中如何使用結構
程序的運行結果如下:
我們從這段程序之中可以看出結構對於多種類型數據的集合處理是很方便的。另外,還可以使用賦值操作符(=)將結構成員賦給另一個同類型的結構,這樣結構中的每個成員都將被設置為另一個結構中相應的成員的值,即使成員是數組。這種賦值被稱為成員賦值。如同代碼中的將pal賦值給test。打印出來他們的值是相同的。
這段程序中還讓我們看到了一個問題,那就是結構的作用域。
結構聲明的位置是很重要的。如果是局部聲明的結構,則這個結構只能在本函數中使用不能在其他函數中使用。但是外部聲明則可以被其後面的任何函數使用。C++不提倡使用外部變量但是提倡使用外部結構聲明。如程序中,inmain是在main內部聲明的結構,所以在程序內部用沒有問題,但是在外部函數function中用就出現了錯誤。如下
結構初始化的方式
1、你可以同時完成定義和創建結構變量
struct perks
{
int key_number;
char car[12];
}mr_smith, ms_jones;
2、甚至可以初始化以這種方式創建變量
struct perks
{
int key_number;
char car[12];
}mr_gitx = {
7,
"Pasdf"
};
//不過將結構定義和聲明分開,可以增加程序的可讀性
3、還有一種特殊的聲明
//它的名稱被省略了
struct
{
int x;
int y;
}position;
/*這樣將創建一個名為position的結構變量。可以使用成員操作符來訪問它的
成員,但是這種類型沒有名稱,因此以後無法創建這種類型的變量。
除了C++程序可以使用結構標記作為類型名稱外,C語言的結構具有目前討論的C++結構的所有特性,但是C++的結構的特性更多。例如,與C的結構不同,C++除了成員變量之外,還可以有成員方法,這些高級的特性經常會被用在類中。
結構數組
整形數組—–顧名思義就是存放整形的數組。每個元素都是一個整形
如int a[10];
字符數組—-顧名思義就是存放字符的數組。每個元素都是一個字符
如 char ptr[10];
類比上述術語
我們就知道結構數組,就是存放結構的數組,它的每一個元素都是一個結構,例如:
struct inflatable
{
char name[20];
int id;
long phone:
};
inflatable geust[2]; //這就是一個結構數組
//對結構初始化我們可以這樣
inflatable geust[2]
{
{"basdf", 12, 123879234}, //geust[0]結構
{"xcfaw", 32, 231834623} //geust[1]結構
};
要初始化結構數組,可以結合使用初始化數組的規則(用逗號分隔每個元素的值,並將這些值用花括號括起來)和初始化結構的規則(用逗號分隔每個成員的值,並將這些值用花括號括起來)。由於數組中每個元素都是結構,因此可以使用結構初始化方式來提供它的值。因此,最終結果為一個被括在花括號中、用逗號分隔的值列表
結構的使用方面(主要是效率的):
結構可以簡化傳入的形參個數,只需要傳遞一個結構體進函數即可,那麼當然結構也可以增加結構傳出的參數個數,返回一個結構將帶出結構中的所有成員。當然這樣的簡化可以增加程序的可讀性也可以提高函數的工作效率。以及在以後的修改中提升很大的效率(比如,你的函數本來有5個參數,結構開發到很大規模的時候突然發現我的函數需要6個參數,呵呵,所有的調用該函數的地方都改一遍???恐怕受不了,但是使用結構做參數的話就不會這樣煩了,只要增加一個成員然後在需要用的地方修改一下就可以了,是不是很高效??)所以,結構是程序開發項目開發中非常重要的!!!!!