第三週 結構型別
1、列舉
定義可以羅列起來的名字
enum color;
·列舉是一種使用者定義的資料型別,用關鍵字enum以如下語法來宣告:
enum列舉型別名字;
·列舉型別名字通常並不真的使用,要用的是在大括號裡的名字,因為他們就是常量符號,型別是int,值依次從0到n
當需要一些可以排列起來的常量值時,定義列舉的意義就是給這些常量值名字
#include
enum color;
void f(enum color c);
int main(void)
void f(enum color c)
·列舉量可以作為值
·列舉型別可以跟上enum作為型別
·但是實際上是以整數來做內部計算和外部輸入輸出的
列舉比巨集好
宣告結構型別
#include
int main(int argc,char const *ar**)
;struct date today;
today.month=07;
...printf("today's date is %i-%i-%i.\n",today.year,today.month,today.day)
---結構體一般放在函式外面
宣告結構型別
-宣告結構的形式
struct point;//宣告結構point
struct point p1,p2;//宣告兩個變數
structp1,p2;
p1,p2都是無名結構,裡面含有x和y
struct pointp1,p2;
p1和p2都是point裡面有x和y的值
結構型別 結構變數
結構的初始化
#inlcude
struct date
結構成員:
1、結構和陣列類似
2、訪問方法:
陣列用運算子和下標訪問其他成員
a[0]=10;
結構用.運算子和名字訪問其成員
today.day
p1.x,p1.y
結構運算
·要訪問整個結構,直接用結構變數的名字
對於整個結構,可以做賦值、取位址,也可以傳遞給函式引數
·p1=(struct point);//相當於p1.x=5;
p1.y=10;
·p1=p2;//相當於p1.x=p2.x;p1.y=p2.y;
結構作為函式引數
int numberofdays(struct date d)
·整個結構可以作為引數的值傳入函式
·即在函式內新建乙個結構變數,並複製呼叫者的結構的值
.優先順序高於&
輸入結構
沒有直接的方式可以一次scanf乙個結構
·if 寫乙個函式來讀入結構
#include
struct point
void getstruct(struct point);
void output(struct point);
void main();
getstruct(y);
output(y);
}void getstruct(struct point p)
void output(struct point p)
---輸入函式裡面的值並沒有傳進主函式裡面
·c語言的特點是在函式呼叫的時候是傳值的
·故函式中的變數p和main函式中的y是不同的變數
·在函式讀入p的數值之後,沒有任何東西進去main函式裡面,故y輸出為(0,0)
如何實現?
定義結構體函式,做結構體賦值
--結構體傳遞給函式,更有效的方式是傳遞指標而不是拷貝值
#include
struct point;
struct point getstruct(void);//定義結構體型別的函式
void output(struct point);
int main(int argc,char const *ar**)
;y=getstruct();//進行結構體賦值
printf("\n");
output(y);
}struct point getstruct(void)
void output(struct point p)
結構指標作為引數
指向結構的指標
struct datemyday;
struct date *p=&myday;//
(*p).month=12;//*p就是myday *p就是指標指的變數
p->month=12;//p所指的那個結構的month
·用->表示指標所指的結構變數中的成員
--花樣寫**
#include
struct point;
struct point* getstruct(struct point*);//結構體指標
void output(struct point);
void print(const struct point *p);
int main(int argc,char const *ar**)
;getstruct(&y);//進行結構體賦值
printf("\n");
output(y);
output(*getstruct(&y));//函式返回指標,*取出該指標的變數,作為函式的輸入變數
print(getstruct(&y));
}struct point* getstruct(struct point *p)
void output(struct point p)
void print(const struct point *p)
--宣告乙個結構型別(資料型別) 結構變數,結構陣列
struct date dates[100];//結構體陣列
struct date dates=,};
1、結構體陣列的初始化
struct time;
struct time timeupdate(struct time now);
struct time testtimes[5]=,,,,
};2、結構體陣列的使用
testtimes[i].hour,
---巢狀的結構
struct point;
struct rectangle;
如果有變數 struct rectangle r;
可以得到:
r.pt1.x r.pt1.y
r.pt2.x r.pt2.y
r為復合結構體
rp為結構體的指標
變數定義:
struct rectangle r,*rp;
rp=&r;
下面四種形式是等價的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
但是沒有rp->pt1->x(因為pt1不是指標)
結構中的結構的陣列
#include
struct point;
struct rectangle;
void printrect(struct rectangle r)
int main(int argc,char const *ar**),,
,}};//2個矩形
for(i=0;i<2;i++)
printrect(rects[i]);
}---typedef 自定義資料型別
c語言提供的乙個用以宣告乙個已有的資料型別的新名字
eg:typedef int length
使得legnth 成為int型別的別名
宣告新的型別的名字
·新的名字是某種型別的別名
·改善了程式的可讀性
typedef long int64_t;
typedef struct adatedate;
/*struct adate*/這一串是原來的型別
date是typedef後的新的名字
結構體的名字就是date
不使用typedef,宣告結構體變數需要加上 struct point p1;
使用之後,宣告結構體為 date p1;
此外,還可以寫成
typedef structdate;
typedef char* strings[10];//strings 10個字串的陣列的型別
typedef struct nodeanode;
ortypedef struct node anode;//使用anode 就可以代替struct node;
----聯合
1、聯合的定義 宣告 初始化
union aneltelt1,elt2;//兩個成員變數和結構體不同,這兩個成員變數共用乙個記憶體空間
僅有乙份記憶體空間
-儲存:1、所有的成員共享乙個空間
2、同一時間只有乙個成員是有效的
3、union的大小是其最大的成員大小
-初始化:對第乙個成員做初始化
elt1.i=4;
elt2.c='a';
elt2.i=0xdeadbeef;
sizeof(union...)=sizeof(每個成員)的最大值
union 主要的使用場景:
#include
typedef unionchi;
int main()
}//小端模式
d2 04 00 00
中國大學MOOC 浙大C語言高階學習筆記03
一 全域性變數 定義在函式外面的變數是全域性變數 全域性變數具有全域性的生存期和作用域 它們與任何函式都無關 在任何函式內部都可以使用它們 include int f void int gall 12 int main int argc,char const ar int f void 1 全域性變...
中國大學MOOC 浙大C語言高階學習筆記05
第六周 互動圖形設計 略 1 圖形程式的終端輸入 函式指標和互動圖形介面程式所體現出來的設計模式 mvc設計模式 圖形的終端輸入輸出 acllib庫 第七周 1 檔案 格式化的輸入輸出 printf flags width prec hll type scanf flag type flag 含義 ...
中國大學MOOC 浙大C語言學習筆記05
7.1 陣列運算 陣列的整合初始化 陣列初始化02 int num0 10 陣列的大小 sizeof給出的整個陣列所佔據的內容的大小,單位是位元組 sizeof a sizeof a 0 sizeof a 0 給出的陣列中單個元素的大小,相除得到了陣列的單元個數 一旦修改 中的初始資料,不需要修改遍...