中國大學MOOC 浙大C語言高階學習筆記01

2021-10-09 12:37:35 字數 4785 閱讀 1580

第三週 結構型別

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 給出的陣列中單個元素的大小,相除得到了陣列的單元個數 一旦修改 中的初始資料,不需要修改遍...