什麼是結構體?
簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別(而結構體是),陣列名稱是常量指標,所以不可以做為左值進行運算,所以陣列之間就不能通過陣列名稱相互複製了,即使資料型別和陣列大小完全相同。
結構體的定義
定義結構體使用struct修飾符,例如:?
12
3
4
5
struct
test
;
上面的**就定義了乙個名為test的結構體,它的資料型別就是test,它包含兩個成員a和b,成員a的資料型別為浮點型,成員b的資料型別為整型。
由於結構體本身就是自定義的資料型別,定義結構體變數的方法和定義普通變數的方法一樣。 ?
1test pn1;
這樣就定義了一test結構體資料型別的結構體變數pn1,結構體成員的訪問通過點操作符進行,pn1.a=10 就對結構體變數pn1的成員a進行了賦值操作。
注意:結構體生命的時候本身不占用任何記憶體空間,只有當你用你定義的結構體型別定義結構體變數的時候計算機才會分配記憶體。
結構體,同樣是可以定義指標的,那麼結構體指標就叫做結構指標。
結構指標通過->符號來訪問成員,下面我們就以上所說的看乙個完整的例子:?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include
#include
using
namespace
std;
struct
test
//定義乙個名為test的結構體
;
void
main()
總之,結構體可以描述陣列不能夠清晰描述的結構,它具有陣列所不具備的一些功能特性。
再看一下下面這段結構體的定義:?
12
3
4
struct
point ;
這段**在c++裡面其實簡單,point是乙個類(class), 且由於用了struct關鍵字,那麼x,y都是public的。然而在c裡面,事情沒這麼簡單。在c裡面point只是乙個tag, struct point才是乙個完整的型別名稱, 所以在c裡面,用宣告乙個poin變數,需要這麼寫:struct point pt; 而在c++可以直接寫:point pt;
在c裡面想直接用類似c++的方法定義變數,需要用typedef, 比如?
12
3
4
typedef
struct
point point;
那麼就可以直接寫point pt; 了。之所以想寫這個總結是因為自己在用struct的時候總是用的不倫不類,比如下面的用法就是不好的我覺得:?
12
3
4
5
struct
point ;
point pt;
這段**是定義pt是c++的用法, 涉及到類,但是定義這個類又只有兩個public的成員變數,像極了純c的struct結構體。這就有點不倫不類了,如果要從物件導向的角度,最好就還是把point定義成class, 然後加上getx, setx, gety, sety去access還有modify成員變數,還要加乙個constructor和destructor:?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
class
point
~point() {}
int
getx()
const
//const means 'this' is constant
int
gety()
const
void
setx(
int
value)
void
sety(
int
value)
private
:
int
x;
int
y;
};
point pt;
上面的**的風格是很好的,而且也不會不倫不類,但是就是稍微有點小題大做或者殺雞用牛刀的感覺,為什麼這麼說呢,比如有時候我們其實很想方便的修改x, y,覺得直接賦值更加自然,何必呼叫乙個函式呢,這個感覺來自於面向過程的c,如果這樣, 我覺得下面這個**也是可以接受的比較自然的一種**(還是物件導向的思維,但是僅僅省略getter和setter而直接access成員變數):?
12
3
4
5
struct
point
};
總結:
c和c++裡面的struct還是需要好好理解,乙個是面向過程,乙個是物件導向,使用的時候千萬不要不倫不類。我覺得c++的物件導向的用法比較合理,c面向過程的用法還是太繁瑣不夠靈活,建議使用倒數第一和倒是第二種struct**風格。
C 結構體 struct 詳解
陣列 array 它是一組具有相同型別的資料的集合。但在實際的程式設計過程中,我們往往還需要一組型別不同的資料,例如對於學生資訊登記表,姓名為字串,學號為整數,年齡為整數,所在的學習小組為字元,成績為小數,因為資料型別不同,顯然不能用乙個陣列來存放。在c語言中,可以使用 結構體 struct 來存放...
c與c 中struct區別
這裡有兩種情況下的區別。1 c的struct與c 的class的區別。2 c 中的struct和class的區別。在第一種情況下,struct與class有著非常明顯的區別。c是一種過程化的語言,struct只是作為一種複雜資料型別定義,struct中只能定義成員變數,不能定義成員函式 在純粹的c語...
c 中的結構 struct
c 中的結構使用struct關鍵字來宣告型別,struct型別是一種值型別,通常用來封裝小型相關變數組,和類是引用型別是不同的,乙個簡單例子 public struct custompoint public void printpoint ny x,y 幾點說明 1 可以為struct定義建構函式和...