C++
- 不要把面向對象和基於過程對立起來,面向對象和基於過程不是矛盾的,而是各有用途、互為補充的。
- 學習C++,既要學會利用C++進行基於過程的結構化程序設計,也要會利用C++進行面向對象的程序設計。
目錄
C語言與C++之間的區別
C語言 | C++ |
---|---|
基於過程:程序=算法+數據結構 | 面向對象並基於過程 |
C語言要求變量的定義應該放在所有的執行語句之前 | C++只需要在第一次使用該變量之前進行定義即可 |
C語言中,輸入和輸出的功能是通過調用scanf函數和printf函數來實現的,輸入和輸出單個字符的函數:getchar和putchar | C++中是通過調用輸入輸出流庫中的流對象cin和cout實現的,同時也依舊支持C語言中的輸入輸出 |
C語言沒有提供邏輯型數據 | C++中增加了邏輯型數據,邏輯常量只有兩個:false和true |
C語言不支持內聯函數、函數的重載、函數模板和有默認參數的函數 | C++中支持內聯函數、函數的重載、函數模板和有默認參數的函數 |
C語言使用字符數組來存放字符串。C-string方法 | C++中提供了一種新的數據類型,字符串類型(string類型),它是在C++標准庫中聲明的一個字符串類。string方法 |
C語言中不存在引用 | C++中存在引用 |
C語言中結構體成員只能是數據 | C++中結構體成員既可以包括數據,也可以包括函數 |
C語言中使用庫函數malloc和free來分配和撤銷內存空間 | C++中使用運算符new和delete,來進行,執行效率高 |
C語言中定義枚舉類型變量時需要包括關鍵字enum | C++中可以不包括enum,直接用枚舉類型名 |
C語言強制類型轉換格式為(int)a | C++中強制類型轉換格式為int(a) |
一、C++基於過程的程序設計
1、簡單程序實例
example 1:
#include <iostream>
using namespace std;
int main()
{
int max(int x, int y);//函數的聲明
int a,b,c;
cin>>a>>b;
c = max(a, b);
cout<<"max = "<<c<<endl;
return 0;
}
int max(int x, int y)
{
int z;
if(x > y) z = x;
else z = y;
return z;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
main
函數必須聲明為int
型,因為操作系統要求執行一個程序后必須向操作系統返回一個數值:如果程序正常執行,則向操作系統返回數值0;否則返回數值-1;- 函數體是由”{}”括起來的;
cout
是C++系統定義的對象名,稱為輸出流對象;cin為輸入流對象(輸入時兩個數據間用一個或多個空格間隔,不能以逗號或其他符號間隔);- “
#include < iostream >
” 是C++的一個預處理指令,是一個包含指令,作用是把文件”iostream”中的內容包含到該命令所在的程序文件中,代替該指令; - “
using namespace std
“的意思是使用命名空間”std”,C++標准庫中的類和函數是在命名空間std中聲明的; - “//”代表從它開始到本行末尾之間的全部內容都作為注釋,同時對於多行注釋也可以用”/ …… /”來表示;
- 程序第5行是對max函數的聲明,聲明過后max函數可以寫在main函數后面;
2、C++程序的實現過程
- 每一個程序單位由以下三部分組成:預處理指令、全局聲明、函數
3、變量
3.1 變量基礎
- 變量屬於標識符。標識符指用來標識變量、函數、數組、類型等實體名字的有效字符序列;
- 變量名代表內存中的一個存儲單元。當程序從變量中取值時,實際是通過變量名找到相應的內存單元,從其中讀取數據;
- 變量具有兩種屬性:作用域(全局變量或局部變量)、存儲期(靜態存儲期或動態存儲期)
- 變量的命名規則:
- 只能由字母、數字、下划線3種字符組成;
- 第一個字符必須為字母或者下划線;
- 常變量又稱為只讀變量:
- 相當於在此變量的基礎上加上一個限定:存儲單元中的值不允許變化;
- 區別使用
#define
指令定義的符號常量和用const
定義的常變量:
符號常量 | 常變量 |
---|---|
符號常量只是用一個符號代替一個字符串,在預編譯時把所有符號常量替換為所指定的字符串,它沒有類型,在內存存在以符號常量命名的存儲單元。 | 常變量具有變量的特征,具有類型,在內存中存在以它命名的存儲單元,可以用sizeof運算符測出其長度。與一般變量不同的是指定變量的值不能改變。 |
3.2 局部變量與全局變量
- 局部變量
- 在一個函數內部定義的變量,它只在本函數或復合語句范圍內有效
- 形參也是局部變量
- 在函數原型聲明中出現的參數名,只在原型聲明中的括號范圍內有效
- 全局變量
- 在函數外定義的變量是外部變量,稱為全局變量,其有效范圍為從定義變量的位置開始到本源文件結束
- 如果在一個函數中改變了全局變量的值,就能影響到其他函數,使其他函數中引用的同名變量也同時改變
- 建議不在必要時不要使用全局變量(占用存儲單元、函數通用性降低)
3.3 變量的存儲類別
- 靜態存儲方式
- 在程序運行期間,系統對變量分配固定的存儲空間
- 靜態存儲區中存放全局變量
- 動態存儲方式
- 在程序運行期間,系統對變量動態地分配存儲空間
- 動態存儲區中存放:函數形式參數、函數中定義的變量(未加
static
的局部變量)、函數調用時的現場保護和返回地址等
- 變量的存儲類別
- 指數據在內存中的存儲方式
- 包括自動的(
auto
)、靜態的(static
)、寄存器的(register
)、外部的(extern
)
- 自動變量:函數中的局部變量,如果不加
static
聲明,編譯系統動態分配存儲空間 - 靜態局部變量:函數中的局部變量的值在調用結束后不消失而保留原值,即其占用的存儲單元不釋放,下次調用該函數時,該變量保留上一次調用結束時的值。
- 雖然靜態局部變量在函數調用后仍然存在,但其他函數不能引用它,在其他函數中不可見
- 靜態局部變量是在編譯時賦初值的(默認為0或空字符),而自動變量賦初值是在函數調用時進行
- 寄存器變量:需要時直接從寄存器中取出參與運算,不必到內存中存取
- 全局變量或外部變量:在函數外部定義的,作用域為從函數定義處開始到本程序文件末尾
extern
只是對一個已定義的外部變量做聲明,以拓展作用域- 當使用
static
在定義外部變量時進行聲明,則此外部變量只限於本文件引用,而不能被其他文件引用(靜態外部變量)
- 自動變量:函數中的局部變量,如果不加
3.4 變量的聲明與定義
- 函數的聲明是函數的原型,函數的定義時函數功能的確立
- 聲明分為定義性聲明(需要建立存儲空間,eg:
int a;
)和引用性聲明(不需要建立存儲空間,eg:extern int a;
) - 廣義來說聲明包括定義,不過為了敘述方便,把建立存儲空間的聲明稱為定義,而把不需要建立存儲空間的聲明稱為聲明
4、運算符
- 運算符種類
- 算數運算符:+、-、*、/、%、++、–
- 關系運算符:>、<、==、>=、<=、!=
- 邏輯運算符:&&、||、!
- 位運算符:<<(按位左移)、>>(按位右移)、&、|、^(按位異或)、~(按位取反)
- 賦值運算符:=及其拓展賦值運算符
- 條件運算符:?:
- 逗號運算符:,
- 指針運算符:*
- 引用運算符和地址運算符:&
- 求字節數運算符:sizeof
- 強制類型轉換運算符
- 成員運算符:.
- 指向成員的運算符:->
- 下標運算符:[]
- 其他:函數調用運算符
- 運算符的優先級:!>算數運算符(帶有”<”或”>”號的優先級大於”==”和”!=”)>關系運算符>&&和||>賦值運算符
- 進行運算時不同類型的數據需要轉為同一類型,轉換規則為如下所示。其中橫向向左的箭頭表示必定轉換;縱向的箭頭表示當運算對象為不同類型時的轉換方向, 箭頭的方向只表示數據類型級別的高低,由低向高轉換。
A[char,short] ==> B(int)
B --> C[unsigned]
C --> D[long]
D --> E[double]
F[float] --> E
- 1
- 2
- 3
- 4
- 5
- 自增和自減運算符:++i(在使用i之前,先使i的值加1)、i++(在使用i之后,i的值加1)、–i(在使用i之前,先使i的值減1)、(在使用i之后,i的值減1)
- 賦值運算符:如果賦值運算符兩側類型不一致,但都是數值型或者字符型時,在賦值時自動進行類型轉換
double
賦值給float
時,要注意數值范圍不能溢出- 字符型賦值給整形時,將字符的ASCII碼賦給整形
- 將
int
,short
或long
型數據賦給一個char
型變量,只將其低8位原封不動地送到char型變量(發生截斷) - 不同類型整型數據間的賦值歸根到底就是一條:按存儲單元中的存儲形式直接傳送
- 條件運算符(唯一一個三目運算符):
- eg:
max = (a>b)? a: b;
- eg:
5 程序結構
5.1 選擇結構
if()...else if()...else
- 多分支選擇結構:
switch() {case x: ...;case y: ...;default :...}
- 各個
case
和default
出現的次序不影響執行結果 - 在執行
switch
語句時,根據switch表達式的值找到與之匹配的cas
e子句,就從此case
子句開始執行下去,不再進行判斷,所以此時需要”break
“語句來達到跳出的目的 - 多個
case
可以共用一組執行語句
- 各個
5.2 循環結構
while(表達式)語句
do 表達式 while(表達式)(do-while語句)
for(表達式1;表達式2;表達式3)語句
- 可以只用”
break
“或”continue
”跳出循環或跳出本次循環
6、函數
6.1 函數的分類
- 用戶使用的角度:
- 系統函數,即庫函數
- 用戶自己定義的函數
- 函數形式:
- 無參函數
- 有參函數
6.2 函數的定義
- 無參函數的定義
/* 類型名 函數名([void]) { 聲明部分 執行語句 } */
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 有參函數的定義
/* 類型名 函數名(形式參數列表) { 聲明部分 執行語句 } */
- 1
- 2
- 3
- 4
- 5
- 6
- 7
6.3 函數的參數
形式參數 | 實際參數 |
---|---|
定義函數時函數名后面括號中的變量名稱 | 在主調函數中調用一個函數時,函數名后面括號中的參數(可以為表達式) |
在未出現函數調用時,形參不占用內存中的存儲單元 | 實參可以為常量、變量或表達式,但是要求變量必須有確定的值 |
實參與形參的類型應相同或賦值兼容(按照不同類型數值的賦值規則進行轉換) | |
實參與形參變量的數據是值傳遞,即單向傳遞。只能由實參傳給形參,無法傳回 |
6.4 函數的調用
- 調用的方式
- 函數語句
- 函數表達式
- 函數參數
printstar(); //函數語句
c = 2 * max(a,b);//函數表達式
m = max(a, sqrt(b));//函數參數
- 1
- 2
- 3
- 函數調用時注意,當實參列表包括多個實參時,對實參的求值順序並不是確定的。許多C++系統是按照從右至左的順序求值。比如,若變量i的值為3時:
func(i, ++i);
/*func(3,4),從左至右順序求值
func(4,4),從右至左順序求值*/
- 1
- 2
- 3
6.4 函數的聲明與函數原型
- 函數聲明是指函數尚未定義的情況下,事先將函數的有關信息通知編譯系統,以便編譯可以正常進行。
- 函數聲明中可以不寫形參名,只寫形參類型,這種聲明成為函數原型
float add(float, float);//函數原型
/*函數類型 函數名(參數類型1, 參數類型2...); 函數類型 函數名(參數類型1 參數名1, 參數類型2 參數名2...);
- 1
- 2
- 3
函數的定義 | 函數的聲明 |
---|---|
定義是指對函數功能的確立 | 聲明是在定義前事先將函數的有關信息通知編譯系統 |
包括指定函數名,函數類型、形參及其類型、函數體等 | 通知函數的名字、函數的類型以及形參的個數、類型和順序(不包括函數體) |
6.5 內置函數(內聯函數)
- 編譯時將函數代碼嵌套到主調函數中,而不是將流程轉出去
- 可以在聲明函數和定義函數同時寫
inline
;也可以只在函數聲明時加inline
,而定義時不加 - 內聯函數中不能包括復雜的控制語句,如循環和
switch
語句
6.6 函數的重載
- C++允許同一個函數名定義多個函數,而這些函數的參數個數和參數類型可以不相同
- 不允許只有函數的類型不同而參數的個數和類型相同,如:
int f(int);
long f(int);
void f(int);
- 1
- 2
- 3
- 重載函數的參數個數、參數類型或參數順序三者中必須至少有一種不同,函數返回值類型可以相同,也可以不同
6.7 函數模板
- 建立一個通用函數,其函數類型和形參類型不具體指定,用一個虛擬的類型來代表
- 定義函數模板的一般形式:
template <typename T>//T為類型參數;typename也可以用class代替,都表示類型名
T max(T a, T b, T c)
{
if(b>a) a = b;
if(c>a) a = c;
return a;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 只適用於函數體相同、函數參數個數相同而類型不同的情況
6.8 有默認參數的函數
- 指定默認值的參數必須防止形參列表的最右端
- 如果函數的定義在函數調用之前,則應在函數定義中給出默認值;如果函數的定義在函數調用之后,則在函數調用之前需要有函數聲明,此時必須在函數聲明中給出默認值,在函數定義時可以不給默認值
- 一個函數不能既作為重載函數,又作為有默認參數的函數
1
…
…
…
…
…
…
…
…
6.9 內部函數和外部函數
- 內部函數:只能被本文件中其他函數調用
static 類型標識符 函數名(形參表)
- 1
- 外部函數:可以供其他文件調用
extern int func(int a, int b)//省略extern,默認為外部函數
- 1
6.10 函數參數的傳遞
- 將變量名作為實參和形參:形參是變量的值,傳遞是單向的
void swap(int a, int b);
int i = 3, j = 5;
swap(i, j);//調用函數時,形參和實參不是同一個存儲單元。值傳遞(傳值方式)
- 1
- 2
- 3
- 傳遞變量的地址:形參是實參變量的指針變量(地址),實參是一個變量的地址
void swap(int *p1, int *p2);
int i = 3, j = 5;
swap(&i, &j);//值傳遞(傳值方式),實參的值是變量的地址
- 1
- 2
- 3
- 形參為實參的引用:以引用作為形參,使形參名作為實參的引用
void swap(int &a, int &b);
int i = 3, j = 5;
swap(i, j);//地址傳遞傳遞(傳址方式),實參是變量名,而傳遞的是變量的地址
- 1
- 2
- 3
7、數組
7.1數組的定義與引用
類型名 數組名[常量表達式]//一維數組的定義
數組名[下標]//一維數組的引用
類型名 數組名[常量表達式][常量表達式]//二維數組的定義
數組名[下標][下標]//二維數組的引用
- 1
- 2
- 3
- 4
- 二維數組元素排列順序為:按行存放,即在內存中先順序存放第1行元素,再存放第2行元素
- 多維數組元素在內存中的排列順序:第一維的下標變化最慢,最右邊的下標變化最快
7.2用數組做函數參數
- 數組元素可以做函數參數,用法與變量相同,傳遞數組元素的值;數組名也可以做實參和形參,傳遞的是數組的起始地址,C++實際上把形參數組名作為一個指針變量來處理
/*...*/
void select_sort(int array[], int n);//函數
int a[10];
select_sort(a,10);//調用函數
/*...*/
void select_sort(int array[], int n)//函數定義
{
/*...*/
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 在用變量做函數參數時,只能將實參變量的值傳遞給形參變量,在調用函數過程中如果改變了形參的值,對實參沒有影響,即實參的值不因形參的值改變而改變
- 而數組名作函數實參時,如果改變了形參數組元素的值,將同時改變實參數組元素的值
7.3 字符數組
7.3.1 字符數組基礎
- 只能對字符數組的元素賦值,而不能用賦值語句對整個數組賦值
char c[5];
c = {'C', 'h', 'i', 'n', 'a'};//錯誤
c[0] = 'C'; c[1] = 'h'; c[2] = 'i'; c[3] = 'n'; c[4] = 'a';//正確
char str[] = {"I am happy"};//正確,使用字符串常量初始化字符數組
char str[] = "I am happy";//正確
- 1
- 2
- 3
- 4
- 5
- 字符串結束標志:遇到字符
'\0'
表示字符串結束。對一個字符串常量,系統自動在所有字符后加'\0'
作為結束符。程序中檢測字符串長度也依靠字符串結束標志 - 如果輸入字符串長於字符數組的長度,此時系統並不報錯,而是將多余的字符元素順序地存放到所定義字符數組后面的幾個字節中,有可能破壞其他數據,甚至出現無法估計的后果
7.3.2 字符串處理函數
- 字符串連接函數
strcat(char[], const char[]);
- 1
- 字符串復制函數
strcpy(char[], const char[]);
strcpy(str1, str2, 2);//將str2中前2個字符復制到str1中
str1 = str2;//錯誤,不能將字符數組直接賦值給另一個字符數組
- 1
- 2
- 3
- 字符串比較函數
strcmp(const char[], const char[]);
/*如果字符串1等於字符串2,函數值為0 如果字符串1大於字符串2,函數值為一正整數 如果字符串1小於字符串2,函數值為一負整數*/
- 1
- 2
- 3
- 4
- 字符串長度函數
strlen(const char[]);//其值為字符串實際長度,不包括'\0'
- 1
7.3.3 字符串類
- 將C++標准庫中的string頭文件包含進來
#include <string>
string string1;//定義字符串變量
string1 = "China";//賦值
- 1
- 2
- 3
- 可以使用簡單的運算符實現連接(
+
)、比較(==,>,<,!=,>=,<=
)、復制(=
) - 字符串數組
- 不要求每個字符串元素具有相同的長度,同一個元素長度也可以變化
- 每個元素的值只包含字符串本身的字符,而不包括
\0
8、指針
- 一個變量的地址稱為該變量的指針
- 專門存放地址(即指針)的變量稱為指針變量
- C++中“
*
”表示指向,比如i_pointer
是一個指針變量,則*i_pointer
表示i_pointer
指向的變量
8.1 指針變量的定義與引用
- 定義指針變量的一般形式為:
基類型 * 指針變量名
/*基類型指指針變量指向的變量的類型
"*"表示定義的該變量為指針變量
- 1
- 2
- 3
- 引用指針變量
int * pointer_1;
int a = 100;
pointer_1 = &a;//變量a的地址給pointer_1
int * pointer_2 = &a;//定義指針變量並初始化
- 1
- 2
- 3
- 4
- 指針變量賦值
p = &a;
p = array;//數組
p = &array[i];
p = max;//函數
p1 = p2;
- 1
- 2
- 3
- 4
- 5
*
與&
的優先級相同,但按照自右而左的方向結合
8.2 指針與函數
8.2.1 指針做函數參數
void swap(int * p1, int * p);//聲明指針參數的函數
int * pointer_1, * pointer_2;
swap(pointer_1, pointer_2);//調用函數
void swap(int * p1, int * p)//函數定義
{
/*...*/
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
8.2.2 指向函數的指針變量
int max(int x, int y);
int (*p)(int,int);//定義指向函數的指針變量
p = max;//指針p指向max函數的入口地址
m = p(a, b);
- 1
- 2
- 3
- 4
8.2.3 返回指針值的函數( )
//類型名 * 函數名(參數列表)
int *a(int x, int y);
- 1
- 2
8.3 指針與數組
int a[10];
int * p;
p = &a[0];//將a[0]地址賦給指針變量p
p = a;//與上面等價
/*p+1指向同一個數組中的下一個元素,實際地址是p+1*d*/
- 1
- 2
- 3
- 4
- 5
8.4 指針與字符串
- 訪問字符串:
- 用字符數組存放一個字符串
- 用字符串變量存放字符串
- 用字符指針指向一個字符串
char str1[] = "I love China!";
cout << str1 << endl;
string str2 = "I love China!";
cout << str2 << endl;
char * str3 = "I love China!";
cout << str3 << endl;
- 1
- 2
- 3
- 4
- 5
- 6
8.5 const指針和void指針
- 指向常量的指針變量:不允許通過指針變量改變它指向的對象的值,但是指針變量p的值(即p的指向)是可以改變的
const 類型名 * 指針變量名;//常用作函數形參,防止指針形參所指對象的值改變影響實參
- 1
- 常指針:指定指針變量的值是常量。即指針變量的指向不能改變。
類型名 * const 指針變量名;//必須在定義時初始化,指定其指向
- 1
- 指向常量的常指針:指針變量指向一個固定的對象,該對象的值不能通過指針變量改變
const 類型名 * const 指針變量名;//必須在定義時初始化,指定其指向
- 1
- void指針:指向空類型或不指向確定類型的數據,其為過渡型的
9、引用
- 相當於給一個變量起別名
- 在數據類型后面出現的
&
是引用聲明符,在其他場合出現的都是地址符(出現在聲明中的&
是引用聲明符,其他情況是地址運算符) - 聲明一個引用時,必須同時使之初始化,聲明后不能再使之作為另一變量的引用
- 不能建立引用數組,不能建立引用的引用,不能建立引用的指針
- 引用機制主要是把它作為函數參數,以擴充函數傳遞數據的功能(傳址方式)
10、用戶自定義數據類型
- 結構體類型(
structure
)、共用體類型(union
)、枚舉類型(enumeration
)、類類型(class
)
10.1 結構體(struct
)
- 結構體中在一個組合項中包含若干個類型不同(也可以相同)的數據項
10.1.1 結構體的聲明、定義、初始化與引用
/*聲明*/
struct 結構體類型名//聲明
{成員表};//類型名 成員名
/*定義*/
struct Student
{/*...*/};
Student student1, student2;//先聲明再定義變量
struct Student
{/*...*/}student1,student2;//聲明(Student結構體)的同時定義變量(student1,student2)
/*初始化*/
struct Student
{/*...*/}student1 = {/*...*/};
struct Student
{/*...*/};
Student student2 = {/*...*/};
/*引用*/
student1 = student2;
student1.num = 10010;//結構體變量名.成員名("."是成員運算符, 優先級最高)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
10.1.2 指向結構體變量的指針
/*以下三種形式等價*/
/*p為指向結構體變量的指針*/
/*結構體變量.成員名,eg:stu.num (*p).成員名,eg:(*p).num p->成員名(->為指向運算符),eg:p->num*/
p->n++;//得到成員n的值,用完后使它加1
++p->n;//得到成員n的值,並使之加1,然后再使用它
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
10.1.3 結構體類型數據作為函數參數
- 用結構體變量名作參數
- 用指向結構體的指針作參數,將結構體變量的地址傳給形參
- 用結構體變量的引用作函數參數,成為實參的別名
10.1.4 new和delete運算符進行動態分配撤銷存儲空間
new 類型[初值]//new分配數組空間時不能指定初值
new int(100);//初值為100的整數空間,返回存儲空間的地址
new char[10];
new int[5][4];
float *p = new float(3.14159);
delete 指針變量;
delete [] 指針變量;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
10.2 枚舉類型(enum
)
- 一個變量只能有集中可能的值,可以定義為枚舉類型
- 枚舉類型按常量處理,成為枚舉常量,編譯系統按定義時的順序對它們賦值為0,1,2,3…
enum 枚舉類型名 {枚舉常量表};
enum weekday{sun, mon, tue, wed, thu, fri, sat};//聲明枚舉類型
weekday workday, week_end;//定義變量
enum weekday workday, week_end;//C語言定義方式
enum weekday{sun, mon, tue, wed, thu, fri, sat}workday, week_end;//聲明同時進行定義
workday = (weekday)2;//C語言強制類型轉換
workday = weekday(2);//C++強制類型轉換
- 1
- 2
- 3
- 4
- 5
- 6
- 7
10.3 聲明新類型(typedef
)
- 使用typedef聲明一個新的類型名類代替已有的類型名
- 也可以對一個結構體類型聲明一個新的名字
typedef int INTERGER;
typedef struct
{
int month;
int day;
int year;
}DATE;//DATE為新類型名,而不是結構體變量
typedef int NUM[100];//聲明NUM為整型數組類型,包含100個元素
typedef char * STRING;//聲明STRING為char * 類型
typedef int (* POINTER)();//聲明POINTER為指向返回整型的函數的指針類型
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10