第九章 函式再探

2021-07-24 07:08:32 字數 4722 閱讀 7400

函式的記憶體位址儲存了函式開始執行的位置,儲存在函式指標中的內容就是這個指標

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)

以下語句說明了如何使用指標呼叫函式

result = pfun(a,b);

9.1.3 函式指標的陣列

函式指標和一般的變數一樣。

建立函式指標的陣列。

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 標號 是實現段內近轉...