函式的記憶體位址儲存了函式開始執行的位置,儲存在函式指標中的內容就是這個指標
9.1. 1 宣告函式指標
int (*pfunction)(int);
函式指標變數的宣告,不指向任何內容,該語句只定義了指標變數。
這個指標的名稱是pfunction,指向乙個引數是int型別、返回值是int型別的函式。這個指標只能指向有這些特徵的函式。
定義如下函式原型:
int
sum(int a,int b);
這個函式有兩個int型別引數,返回值的型別是int ,
int *(pfun)(int
int) = sum;
#include
int sum(int , int);
int product(int, int);
int difference(int, int);
int main()
int sum(int
x, int
y)int product(int
x, int
y)int difference(int
x, int
y)
以下語句說明了如何使用指標呼叫函式9.1.3 函式指標的陣列result = pfun(a,b);
函式指標和一般的變數一樣。
建立函式指標的陣列。
int (*pfuncations[10])(int)
這條語句宣告了乙個包含10個元素的pfunctions陣列。這個陣列裡的每個元素都能儲存乙個函式的位址
函式指標的陣列
> **如何使用函式指標的陣列??**
#include
int sum(int, int);
int product(int,int);
int difference(int, int);
int main()
result = pfun[1](pfun[0](a, b), pfun[2](a, b));
printf("the product of the sum and the difference =%2d\n",result);
return0;}
int sum(int
x, int
y)int product(int
x, int
y)int difference(int
x, int
y)
9.1.4 作為變元的函式指標
#include
int sum(int, int);
int product(int,int);
int difference(int ,int);
int any_function(int (*pfun)(int,int),int
x,int
y);int main(void)
int any_function(int(*pfun)(int, int), int
x, int
y)int sum(int
x, int
y)int product(int
x, int
y)int difference(int
x, int
y)
9.2.1 靜態變數:函式內部的追蹤
自動變數是在宣告時自動建立,在程式退出宣告它的塊後自動銷毀。
只要正在執行的語句在宣告變數的函式內,函式中的包含資料的記憶體就會一直儲存該資料。
在例子中演示靜態變數的用法(使用靜態變數)
#include
void test1(void);
void test2(void);
int main(void)
return0;}
void test1(void)
void test2(void)
編譯器只將靜態變數初始化一次,初始化操作是在程式開始之前進行的,所以總是可以確保靜態變數在使用時初始化。
只要程式開始執行,靜態變數就一直存在,但是靜態變數只能在宣告靜態變數的範圍之內可見,不能再該作用域的外部作用。
自動變數預設不會在程式開始執行時初始化。自動變數會在每次執行函式時初始化為0,在每次退出後刪除,
9.2.2 在函式之間共享變數
全域性變數的宣告方式和一般的變數相同,但宣告的位置決定了變數是否為全域性變數
自動變數:
靜態變數:關鍵字static放在變數宣告的前面
試試看:使用全域性變數在函式之間共享count變數
#include
intcount = 0; //declare a global variable
//function prototypes(函式原型)
void test1(void);
void test2(void);
int main()
return0;}
//function test1 using the global variable
void test1(void)
//function test2 using a static variable
void test2(void)
test1 count = 1
test2 count =1
test1 count = 2
test2 count =2
test1 count = 3
test2 count =3
test1 count = 4
test2 count =4
test1 count = 5
test2 count =5
#include
intcount =0;
//function prototypes
void test1(void);
void test2(void);
int main()
return0;}
//function test1 using the global variable
void test1(void)
//function test2 using a static variable
void test2(void)
//已初始化的自動變數
test1 count = 1
test2 count =1
test1 count = 2
test2 count =1
test1 count = 3
test2 count =1
test1 count = 4
test2 count =1
test1 count = 5
test2 count =1
#include
intcount =0;
void test1(void);
void test2(void);
int main()
return0;}
void test1(void)
void test2(void)
test1 和test2共享全域性變數
test1 count = 1
test2 count =2
test1 count = 3
test2 count =4
test1 count = 5
test2 count =6
test1 count = 7
test2 count =8
test1 count = 9
test2 count =10
遞迴的主要用途是解決複雜問題的,很難用簡單的例子說明其工作原理。
計算整數階乘:
//calculating factorials using recursion
#define _stdc_want_lib_ext1_ 1
#include
unsigned
long
long factorial(unsigned
long
long);
int main(void)
//a recursive factorial function
unsigned
long
long factorial(unsigned
long
long n)
第九章 再論陣列
1,char s和char s等價的情況 作為函式定義的形式引數 僅限於這種情況 例項 include int main 2,對陣列的引用如a i 在編譯時,總是被編譯改寫成 a i 的形式.在表示式中,指標和陣列是可以互換的,因為他們在編譯器那裡的最終形式都是指標,並且都可以進行下標操作.3,標準...
第九章 Mysql函式
簡介 數學函式 處理數字 字串函式 處理字串 日期和時間函式 處理日期和時間,獲取時間 條件判斷函式 控制條件選擇 系統資訊函式 獲取mysql系統資訊,包括資料庫名稱,當前使用者名稱和資料庫版本 加密函式 對字串加密和解密 其他函式 格式化函式和鎖函式 函式 作用 函式 作用 abs x 絕對值l...
第九章(筆記)
轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...