好好學習了一下復合數據類型,結構體,聯(lián)合,枚舉。
結構體的定義:
struct name
{
int a;
int b;
}change;
name是數據類型,即該結構體的數據類型。以后就可以直接用name來定義該數據類型的變量。change是該結構體類型的變量。
結構體有幾個特點:
1 結構體是一種數據類型,并不占有內存。因此如果有如下定義:
struct name{
char a[10]=" abcd";
int b;
}change;
這種寫法是錯誤的,因為不能直接在結構體內對成員賦值。并沒有內存。
2 結構體所占內存的計算
一般是各個成員類型的內存之和,但是還要注意與運行環(huán)境有關,像32位機,每次處理數據是四個字節(jié)四個字節(jié)的處理,因此對于結構體中成員類型內存應該是四的倍數,例如:
struct name
{
int a;
char b;
char c;
}change ;
此時結構體的內存總和是4+4,8個字節(jié)。
當交換三個變量的定義順序,b a c順序,此時的內存是4+4+4 =12個字節(jié)。
但是 當成員中有一個short int 類型,此時就應該是2的倍數,因為short int 是兩個字節(jié),需要統(tǒng)一。
3 變化結構體定義的形式 如:
(1 ) struct neme
{
int a;
int b;
}c;
(2) struct
{
int a;
}c;
(3)typedef struct name
{int a;
int b;
}c;
上述三個例子中c 分別是 結構體變量,結構體變量,結構體類型名。一和二的不同是 第二種c是無名的變量。因此是獨一無二的一個該類型。要想定義一個指針??梢栽诙x結構體的時候同時定義兩個變量,一個 c *p; p=&c;此時便指向了c變量。這個時候用強制類型是不行的。
此外還要注意對結構體成員的訪問,(*p).a;或者p->a;
聯(lián)合
union name
{
int a;
char b;
}change;
共用體的結構定義和結構體的定義是一樣的,只是內存分配的形式不一樣,共用體是占用數據類型的類型的內存,
如上面的例子,可知該共用體的內存是4個字節(jié)。
因此對共用體賦值的時候會出現(xiàn)麻煩。例如:
change.a=0;
change.b=-7;
cout< 此時的結果不是-7;共用體的系統(tǒng)內存非配是底地址靠齊,因此-7是占一個字節(jié),位是符號位,但是對于整形的數來說并不是符號位,所以高位都是0,結果是256-7=249;所以對共用體的賦值一定要注意。
枚舉
enum day{mon,tue,wed,thr};
枚舉類型,day是類型,mon 等是枚舉值,系統(tǒng)默認從0開始賦值,后一個事前一個加一??荚嚧筇崾久杜e值還可以自己來對其賦值。
如:mon=4,tue,wed=7,thr
此時枚舉值是4 5 7 8
可以定義枚舉變量 day a;
a=0;這樣賦值是不對的,因為枚舉類型的變量賦值只能是枚舉值的值,因此a=mon,這個時候就是正確的。
還有,枚舉類型的內存, 都是4個字節(jié)。
結構體的定義:
struct name
{
int a;
int b;
}change;
name是數據類型,即該結構體的數據類型。以后就可以直接用name來定義該數據類型的變量。change是該結構體類型的變量。
結構體有幾個特點:
1 結構體是一種數據類型,并不占有內存。因此如果有如下定義:
struct name{
char a[10]=" abcd";
int b;
}change;
這種寫法是錯誤的,因為不能直接在結構體內對成員賦值。并沒有內存。
2 結構體所占內存的計算
一般是各個成員類型的內存之和,但是還要注意與運行環(huán)境有關,像32位機,每次處理數據是四個字節(jié)四個字節(jié)的處理,因此對于結構體中成員類型內存應該是四的倍數,例如:
struct name
{
int a;
char b;
char c;
}change ;
此時結構體的內存總和是4+4,8個字節(jié)。
當交換三個變量的定義順序,b a c順序,此時的內存是4+4+4 =12個字節(jié)。
但是 當成員中有一個short int 類型,此時就應該是2的倍數,因為short int 是兩個字節(jié),需要統(tǒng)一。
3 變化結構體定義的形式 如:
(1 ) struct neme
{
int a;
int b;
}c;
(2) struct
{
int a;
}c;
(3)typedef struct name
{int a;
int b;
}c;
上述三個例子中c 分別是 結構體變量,結構體變量,結構體類型名。一和二的不同是 第二種c是無名的變量。因此是獨一無二的一個該類型。要想定義一個指針??梢栽诙x結構體的時候同時定義兩個變量,一個 c *p; p=&c;此時便指向了c變量。這個時候用強制類型是不行的。
此外還要注意對結構體成員的訪問,(*p).a;或者p->a;
聯(lián)合
union name
{
int a;
char b;
}change;
共用體的結構定義和結構體的定義是一樣的,只是內存分配的形式不一樣,共用體是占用數據類型的類型的內存,
如上面的例子,可知該共用體的內存是4個字節(jié)。
因此對共用體賦值的時候會出現(xiàn)麻煩。例如:
change.a=0;
change.b=-7;
cout<
枚舉
enum day{mon,tue,wed,thr};
枚舉類型,day是類型,mon 等是枚舉值,系統(tǒng)默認從0開始賦值,后一個事前一個加一??荚嚧筇崾久杜e值還可以自己來對其賦值。
如:mon=4,tue,wed=7,thr
此時枚舉值是4 5 7 8
可以定義枚舉變量 day a;
a=0;這樣賦值是不對的,因為枚舉類型的變量賦值只能是枚舉值的值,因此a=mon,這個時候就是正確的。
還有,枚舉類型的內存, 都是4個字節(jié)。