結構-struct

Download Report

Transcript 結構-struct

struct – 結構
結構
•虛擬世界是由結構撐起來的
•結構用來記錄儲存各式各樣的資訊
•是一種使用者自定的型態,可將不同的資
料型態串在一起。舉例而言:「學生個人
資料表」,裡頭有姓名(字串型態)、年齡
(整數型態)、生日(日期型態)…等等。
例子:學生資料
#include <stdio.h>
#include <string.h>
void main() {
struct Student_Data {
char name[10];
int age;
char address[50];
char interest[11];
} stu;
strcpy(stu.name,"張三");
stu.age = 25;
strcpy(stu.address, “台中縣沙鹿鎮中棲路34號");
strcpy(stu.interest, "basketball");
printf("The student's name is: %s\n", stu.name);
printf("The student's age is: %d\n", stu.age);
printf("The student's address is: %s\n", stu.address);
printf("The student's interest is: %s\n", stu.interest);
}
語法
struct 結構名稱
{
欄項資料型態 欄項變數名稱;
欄項資料型態 欄項變數名稱;
欄項資料型態 欄項變數名稱;
:
:
} 變數Ⅰ,變數Ⅱ……;
例子1
struct Student_Data {
char name[10];
int age;
char address[50];
char interest[11];
} stu1,stu2, stu3;
例子2
struct Student_Data {
char name[10];
int age;
char address[50];
char interest[11];
} ;
struct Student_Data stu1, stu2;
//宣告了二個學生的資料結構
例子3 –使用typedef
typedef struct {
char name[10];
int age;
char address[50];
char interest[11];
} Student_Data;
Student_Data stu1, stu2;
例子4-用陣列宣告整班的學生
•//承上個例子
Student_Data Students[50];
例子5-定義座標系統中的點結構
typedef {
int x;
int y;
} point;
point p1, p2;
p1.x = 10; p1.y = 10;
p2.x = 20; p2.y = 10;
結構成員
•宣告在結構中的變數,為結構的成員。
•用’.’存取結構的成員
–stu1.name
–stu1.address
•‘.’稱為成員存取運算子
typedef
•用來對一個資料型態起一個新名字
•目的是為了使原始碼更易於閱讀和理解
union 聯合型態
• 結構型態和聯合型態很像,最大的差異是,結構型態的成
員每個都佔有自己的記憶體,而聯合型態的成員全部共用
一塊記憶體位置。
•
我們可以說,聯合型態的資料是在不同時間,取得不同
名稱的成員資料,這些成員佔用相同的記憶體位置。所需
記憶體的大小,就是所有成員中佔用記憶體空間最大的。
– 例如,同一筆資料有時當成一個整數來用,有時當成兩個字元來
用,就可以用 union 來宣告。
• 使用 union 的目的是為了節省記憶體的使用,更重要的目
的是相同的資料有不同的用法。最常應用在系統呼叫的引
數,或是與硬體相關的暫存器等。
格式
union 標籤名稱
{
成員宣告1;
成員宣告2;
成員宣告3;
.
.
.
}
每個成員宣告都包括資料型態與成員名稱,用分號結束。
例子
union common
{
char ch;
int i;
long l;
float f;
};
• 這4個成員 ch,i,l,f 分別是 char,int,long,float 的型態,但是
佔用相同的記憶體位置。其中 char 佔1個 byte,int 須用2
個 bytes,long 佔個 8 bytes,float 則須用4個 bytes,取
最大值可知共用的記憶體為4個 bytes。
例子
#include <iostream>
#include "stdio.h"
using namespace std;
int main(){
union UDATA {
unsigned int i;
unsigned char c;
} data;
}
data.i = 66;
printf("字元值是:%c 十六進位值是:%x
十進位值是:%d\n",data.c, data.i, data.i);
data.i = 99;
printf("字元值是:%c 十六進位值是:%x
十進位值是:%d\n",data.c, data.i, data.i);
data.c = 'A';
printf("字元值是:%c 十六進位值是:%x
十進位值是:%d\n",data.c, data.i, data.i);
例子 –與上面類但結果…
#include <iostream>
#include "stdio.h"
using namespace std;
int main(){
union UDATA {
unsigned int i;
unsigned char c;
} data;
@!#!!@#!@#!@#!
@
為什麼會這樣?
data.c = 'A';
printf("字元值是:%c 十六進位值是:%x 十進位值是:%d\n",data.c, data.i, data.i);
data.i = 66;
printf("字元值是:%c 十六進位值是:%x 十進位值是:%d\n",data.c, data.i, data.i);
data.i = 99;
printf("字元值是:%c 十六進位值是:%x 十進位值是:%d\n",data.c, data.i, data.i);
}
enum
• 列舉(Enumeration)型別,就是以關鍵字enum開始加上一個
列舉名稱,並以大括號括住要群組管理的常數,例如:
enum Action{stop, sit, stand, walk, run};
• 上例中宣告一個列舉型態Action,大括號中每一個元素稱為列
舉元(enumerator),預設上列舉元從第一個開始的實際數值
是0,然後依次遞增,以上例而言,stop為0、sit為1、stand
為2、walk為3、run為4,您也可以自行為列舉元設定數值,例
如:
enum Action{stop = 1, sit, stand, walk, run};
• 上例來說,stop為1,下一個列舉元如果沒有設定數值的話,
則自動遞增1,所以sit為2、stand為3、walk為4、run為5,列
舉的常數值不需獨一無二,例如下例:
enum Action{stop = 1, sit, stand = 2, walk, run};
• 下一個列舉元如果沒有設定數值的話,則自動遞增1,所以上
例中stop為1、sit為2、stand為2、walk為3、run為4。
• 宣告列舉之後,您可以用它來宣告列舉變數,例如:
– enum Action action = stop;