自定義資料型別(C 譚浩強第三版筆記

2021-10-07 07:08:30 字數 3498 閱讀 5701

結構體(structure)、共用體(union)型別、列舉(enumeration)型別、類(class)型別等。

結構體:在乙個組合項中包含若干個型別不同(也可相同)的資料項。

struct 結構體型別名

{ 成員表(域表)};

方法一:先宣告結構體型別再定義變數;

方法二:宣告型別同時定義變數;

如:

struct student      //宣告乙個結構體型別 student

{ int num;

//每個成員(或稱乙個域)

char name[20]

;//型別名 成員名

char ***;

int age;

float score;

char addr[30]

;};//定義變數,方法二:將 【;】改為 【student 1,student2;】

student student1 ,student2;

//定義變數,方法一

方法一:可將結構體變數賦值給另一相同結構體變數。如:student1=student2;

方法二:可引用結構體變數中乙個成員的值。如:student1.num =10010;

可得一般形式為:結構體變數名.成員名

結構體陣列:每個陣列元素都是乙個結構體型別的資料,都分別包括各個成員專案。

如:person leader[3]=

;int

main()

while

(p!=

null);

/輸出完c結點後p的值為null

return0;

}以上這種鍊錶稱為:靜態鍊錶,即:所有結點(結構體變數)都是在程式中定義的,不是臨時開闢的,也不能用完後釋放。

動態鍊錶:各結點是可以隨時插入和刪除的,這些結點並沒有變數名,只能先找上乙個結點,才能根據它提供的下乙個結點的位址找到下乙個結點。只有提供第乙個結點的位址,即頭指標head,才能訪問整個鍊錶。

方法一:用結構體變數名作引數。(一般很少用這種方法)

方法二:用指向結構體變數的指標作實參,將結構體變數的位址傳給形參。

方法三:用結構體變數的引用作函式形參,它就成為實參(是結構變數)的別名。

課本p200有三個例項。

c語言(c++保留):利用庫函式mallocfree來分配和撤銷記憶體空間。

c++:用newdelete運算子來取代。

注:1.new運算子:動態分配記憶體。 delete運算子:釋放已經分配的記憶體空間。

2.new與delete可適用於任何情況,但malloc與free卻很多時候不適用。

原因:在類當中,malloc不會呼叫類的建構函式,而new會呼叫類的建構函式,同樣道理,free不會呼叫類的析構函式,而delete會呼叫類的析構函式。

new運算子的一般格式

指標變數 = new 型別 (常量)

指標變數 = new 型別 [表示式]

注:1.常量是初始值可以預設。

2.用new分配陣列空間時不能指定初值。

3.作用:從堆分配一塊型別大小的儲存空間,並返回初始值。

delete運算子的一般格式

delete 指標變數(對變數)

delete[ ] 指標變數(對陣列)

注:指標變數必須是乙個new返回的指標,其實malloc返回的指標也是可以的。

關於new和delete的用法:

new

int;

/開闢乙個存放整數的儲存空間,返回乙個指向該儲存空間的位址(即指標)

newint

(100);

/開闢存放乙個整數的空間,並指定該整數的初值為100,返回乙個指向該儲存空間的位址

newchar[10

];/開闢乙個存放字元陣列(包含10個元素)的空間,返回字元陣列首元素的位址

newint[5

][4]

;/開闢乙個存放二維整型陣列(大小為5

*4)的空間,返回首元素的位址

float

*p =

newfloat

(3.14159

)/開闢乙個存放單精度數的空間,並指定該數的初值為3.14159,將返回的該空間的位址賦給指標變數p

列舉(enumeration)型別:若乙個變數只能有幾種可能的值,則可定義列舉型別。

所謂「列舉」是指將變數的值一一枚舉出來,變數的值只能在列舉出來的值的範圍內。

宣告列舉型別的一般形式

enum 列舉型別名 [列舉常量表];

說明

1.列舉元素按常量處理,故稱列舉常量。(不能賦值,值是固定的)

2.列舉元素作為常量是有值的,其值為整數,按定義時的順序賦值0,1,2,3,…(也可以申明時指定元素的值)。

3.列舉值可做判斷比較,按整數比較規則。

4.不可對列舉變數直接賦整數,只接受列舉型別資料。

用typedef宣告乙個新的型別名來代替已有的型別名:

typedef

int integer;

//指定用識別符號integer代表int

//故而以下兩行等價

int i,j;

integer i,j;

歸納:

宣告乙個新型別名的方法【陣列】:

1.先按定義變數的方法寫出定義語句(如 int i;)【int n[100];】。

2.將變數名換成新型別名(如 將i換count,即 int count)【int num[100];】。

3.在最前面加typedef(如 typedef int count)【typedef int num[100];】。

4.然後可用新型別名(如 count)去定義變數【num n;(n是包含100個整型元素的陣列)】。

注:1.typedef只對已存在的型別增加乙個型別名,沒有創造新的型別。

2.可用typedef宣告新型別名,但不能用來定義變數。

3.用typedef宣告陣列型別、字串型別,比較方便。

4.用於不同系統之間移植更改效率高,正常將定義型別單獨放在乙個標頭檔案,使用方便。

譚浩強C語言 第三版 習題9 3

題目描述 三角形面積 sqrt s s a s b s c 其中s a b c 2,a b c為三角形的三邊。定義兩個帶參的巨集,乙個用來求area,另乙個巨集用來求s。寫程式,在程式中用帶實參的巨集名來求面積area。輸入描述 a b c三角形的三條邊,可以是小數。輸出描述 三角形面積,保留3位小...

譚浩強C語言 第三版 習題11 5

題目描述 有n個學生,每個學生的資料報括學號 姓名 3門課的成績,從鍵盤輸入n個學生的資料,要求列印出3門課的總平均成績,以及最高分的學生的資料 包括學號 姓名 3門課成績 輸入描述 學生數量n佔一行每個學生的學號 姓名 三科成績佔一行,空格分開。輸出描述 各門課的平均成績 最高分的學生的資料 包括...

C 自定義資料型別

c 除了提供多種基本的資料型別 如 int float double char等 供使用者使用外,還允許使用者根據需要自己宣告一些型別,例如陣列 結構體 structure 型別 共用體 union 型別 列舉 enumeration 型別 類 class 型別等,這些統稱為 使用者自定義型別 us...