C語言中的結構體與面向物件程式設計思想
沒有萬能的程式設計技術
沒有隻產生正確的結果的程式語言
不是每個專案的程式設計都是從零開始的
—-《Object-Oriented Programming With ANSI-C》
一、C語言結構體
1、結構體是什麼
(1)用途
結構體是一種可以包含一個或者多個不同資料型別的資料結構,是一種可以自己定義的資料型別。與陣列不同,結構體的多個數據可以是不同的資料型別。
結構體在純C語言環境中程式設計常有兩種用途:將多個描述一個物件的資料打包,以體現層次結構,避免大量的垃圾變數名;在利用結構體記憶體偏移的特性,實現對暫存器的描述。
本文介紹的主要是其在
(2)語法
定義一個結構體
使用結構體首先需要定義一個結構體
struct{ //大括號內為結構體的成員
int a; //定義成員變數
int b;
} my_struct; //結構體名
這段程式碼會生成一個結構體my_struct
,可以用以下程式碼測試這個結構體正確執行。
#include<stdio.h>
struct{
int a;
int b;
}my_struct;
int main(void){
printf("Please input:");
scanf("%d %d",&(my_struct.a),&(my_struct.b));
printf ("%d %d\n",my_struct.a,my_struct.b);
return 0;
}
正確執行時,將會有以下結果:
Please input:1 2
1 2
請按任意鍵繼續. . .
這說明定義結構體是成功的。
使用結構體中變數的語法為結構體名.變數名
,結構體複製的時候可以使用=
號直接複製。例如:
#include<stdio.h>
struct{
int a;
int b;
} my_struct,my_test;
int main(void){
printf("Please input:");
scanf("%d %d",&(my_struct.a),&(my_struct.b));
my_test = my_struct;
printf("%d %d\n",my_test.a,my_test.b);
return 0;
}
這段程式碼將會產生與上面程式碼一樣的結果,這說明可以用等於號直接複製一個結構體。
定義一個結構體型別
C語言中有typedef
關鍵字,可以用於自定義資料型別,例如:
typedef int my_type;
這時,my_type
就可以代替int
使用。
注:這樣做看似無意義,但是在不同平臺編譯程式碼的時候可以通過只改變幾個變數達到控制欄位長度的作用。
這種方法也同樣適用於結構體,宣告一個結構體型別可以讓我們不必每一次使用相同的結構體型別的時候都要重新寫結構體的成員,只需要用結構體型別宣告就可以了。例如:
typedef struct{
int a;
int b;
}my_struct_type;
接下來我們通過以下程式碼測試這個結構體型別:
#include<stdio.h>
typedef struct{
int a;
int b;
}my_struct_type;
my_struct_type my_struct,my_test;
int main(void){
printf("Please input:");
scanf("%d %d",&(my_struct.a),&(my_struct.b));
my_test = my_struct;
printf("%d %d\n",my_test.a,my_test.b);
return 0;
}
當這個程式出現下面的結果的時候,說明定義結構體型別是成功的。
Please input:1 2
1 2
請按任意鍵繼續. . .
定義一個結構體陣列
與基本型別一樣,結構體也可以通過順序儲存來實現對一系列結構體物件的儲存。
順序儲存結構是儲存結構型別中的一種,該結構是把邏輯上相鄰的節點儲存在物理位置上相鄰的儲存單元中,結點之間的邏輯關係由儲存單元的鄰接關係來體現。在C語言中,這種儲存方法通常用陣列實現。
typedef struct{
int a;
}my_struct_type;
my_struct_type my_struct[10];
與陣列一樣,可以通過下標的方式完成遍歷:
#include<stdio.h>
typedef struct{
int a;
}my_struct_type;
my_struct_type my_struct[10];
int main(void){
int i;
for(i=0;i<10;i++){
my_struct[i].a=i;
}
for(i=0;i<10;i++){
printf("%d ",my_struct[i].a);
}
printf("\n");
return 0;
}
成功執行將會得到以下結果:
0 1 2 3 4 5 6 7 8 9
請按任意鍵繼續. . .
結構體指標
與基本型別一樣,結構體也可以通過指標訪問,例如:
#include<stdio.h>
typedef struct{
int a;
}my_struct_type;
my_struct_type my_struct;
my_struct_type* pmy_struct;
int main(void){
my_struct.a=2;
pmy_struct = &my_struct;
printf("%d ",(*pmy_struct).a);
printf("\n");
return 0;
}
成功執行後會得到以下結果:
2
請按任意鍵繼續. . .
請注意:在程式碼中使用了這個方式使用結構體指標(*pmy_struct).a
,其是可以被pmy_struct->a
替代的。
使用結構體指標動態的申請空間
與其他資料型別一樣,利用結構體指標也可以通過malloc()
這樣的函式動態的申請空間,語法如下:
pmy_struct = (my_struct_type*)malloc(sizeof(my_struct_type));
通過測試程式碼檢查申請的情況:
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int a;
}my_struct_type;
my_struct_type* pmy_struct;
int main(void){
pmy_struct = (my_struct_type*)malloc(sizeof(my_struct_type));
pmy_struct->a = 2;
printf("%d ",pmy_struct->a);
printf("\n");
return 0;
}
如果輸出和下面的執行結果一樣,說明申請成功:
2
請按任意鍵繼續. . .
注意:這段程式碼是有缺陷的,通常使用malloc()申請空間後需要檢查指標是否為空,否則一旦空間申請失敗,將出現嚴重錯誤。
待填坑