如果在程序中定義了一個函數,那么在編譯時系統就會為這個函數代碼分配一段存儲空間,這段存儲空間的首地址稱為這個函數的地址。而且函數名表示的就是這個地址。既然是地址我們就可以定義一個指針變量來存放,這個指針變量就叫作函數指針變量,簡稱函數指針。
創新互聯建站主要從事成都網站制作、成都網站建設、網頁設計、企業做網站、公司建網站等業務。立足成都服務瑯琊,10多年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18982081108
那么這個指針變量怎么定義呢?雖然同樣是指向一個地址,但指向函數的指針變量同我們之前講的指向變量的指針變量的定義方式是不同的。例如:
int(*p)(int, int);
這個語句就定義了一個指向函數的指針變量 p。首先它是一個指針變量,所以要有一個“*”,即(*p);其次前面的 int 表示這個指針變量可以指向返回值類型為 int 型的函數;后面括號中的兩個 int 表示這個指針變量可以指向有兩個參數且都是 int 型的函數。所以合起來這個語句的意思就是:定義了一個指針變量 p,該指針變量可以指向返回值類型為 int 型,且有兩個整型參數的函數。p 的類型為 int(*)(int,int)。
所以函數指針的定義方式為:
函數返回值類型 (* 指針變量名) (函數參數列表);
“函數返回值類型”表示該指針變量可以指向具有什么返回值類型的函數;“函數參數列表”表示該指針變量可以指向具有什么參數列表的函數。這個參數列表中只需要寫函數的參數類型即可。
我們看到,函數指針的定義就是將“函數聲明”中的“函數名”改成“(*指針變量名)”。但是這里需要注意的是:“(*指針變量名)”兩端的括號不能省略,括號改變了運算符的優先級。如果省略了括號,就不是定義函數指針而是一個函數聲明了,即聲明了一個返回值類型為指針型的函數。
那么怎么判斷一個指針變量是指向變量的指針變量還是指向函數的指針變量呢?首先看變量名前面有沒有“*”,如果有“*”說明是指針變量;其次看變量名的后面有沒有帶有形參類型的圓括號,如果有就是指向函數的指針變量,即函數指針,如果沒有就是指向變量的指針變量。
int *i=500; 從語法來說,是錯誤的。錯在初始化方式。
int *i; 這是聲明,這里的變量 i 聲明為 指針,用于指向 int 型變量。
若要初始化,需要用地址。例如:
int a = 1234;
int *i=a;
a 是變量 a的地址,初始化,讓 指針 i 指向 a的地址。
這樣 聲明后,語句中, i 是地址; 語句中, *i 是 值。 (強調是語句中。c/c++語言,形式邏輯不成立,外貌 一樣的符號表達,在聲明和在語句是不一樣的!)
輸出語句: printf("%p %d\n",i,*i); 輸出 地址 i 和值 *i
例如輸出: 0018FF44 1234
===========
int *i=500; 500 是地址,
應寫成 int *i= (int *) 500; 這樣,語法就對了,
printf("%d\n",i); 輸出地址 500
但是,這個存儲 單元 不好用。 *i = 1234; 編譯可以通過,執行有錯。
int *i= (int *)0x0018FF44; 這個存儲 單元 也許好用。
printf("%p %d\n",i,*i); 也許可以了。
分析方法:右左法,遇到括號返方向
int (* func)(int * p);
分析: func - 右) - 左 * - func是一個指針,更新當前類型為指針 - 左( - 跳出括號 - 右( - 查表得指針指向函數,func是一個函數指針,()里的為函數參數,更新當前類型為函數 - 左int - 查表得函數返回值類型為int
結論: func是一個函數指針,指向的函數有一個類型為int * 的參數且返回值類型為int.
int (* func)(int * p, int (* f)(int* ));
分析: func - 右) - 左 * - func是指針,更新當前類型為指針 - 左( - 跳出括號 - 右( - func是函數指針,更新當前類型為函數 - 左int - 指向的函數的返回值類型為int
結論: func是一個函數指針,指向的函數返回值類型為int,有2個參數,一個類型為int * ,另一個類型為函數指針,指向的函數返回值類型為int且有一個int * 類型的參數.
int (* func[5])(int * p);
分析: func - 右[ - func為數組,有5個元素,更新當前類型為數組 - 右) - 左* - 數組元素為指針,更新當前類型為指針 - 左( - 跳出括號 - 右( - 數組元素為函數指針,更新當前類型為函數 - 左int - 指向的函數返回值類型為int
結論略~
下面的例子省略方向提示,更新當前類型提示,遇括號轉向,跳出括號以及結論(手懶,剁
int (* (* func)[5])(int * p);
分析: func - * - func是指針 - [ - 指向有5個元素的數組 - * - 數組元素是指針 - ( - 數組元素是函數指針 - int - 指向的函數返回值類型為int
int (* (* func)(int * p))[5];
分析: func - * - func是指針 - ( - func是函數指針 - * - 指向的函數返回值類型為指針 - [ - 返回的指針指向有5個元素的數組 - int - 數組元素類型為int
int func(void) [5];
分析: func - ( - func是函數 - int - 返回值類型為int - [ - 返回值類型為有5個int元素的數組
int func 5 ;
分析: func - [ - func是數組 - ( - 數組元素是函數 - int - 函數返回值類型為int
int (* (* func)[5][6])[7][8];
分析: func - * - func是指針 - [ - func指向有5個元素的數組 - [ - 5元素數組里的每個元素是有6個元素的數組 - * - 6元素數組的每個元素為指針 - [ - 指針指向7元素數組 - [ - 7元素數組的每個元素為8元素數組 - int - 8元素數組元素為int
int (* (* (* func)(int * ))[5])(int * );
分析: func - * - func是指針 - ( - func是函數指針 - * - 函數返回值為指針 - [ - 返回值指向5元素數組 - * - 5元素數組元素為指針 - ( - 指針為函數指針 - int - 函數返回值為int
int (* (* func[7][8][9])(int* ))[5];
分析: func - [ - func是7元素數組 - [ - 7元素數組元素為8元素數組 - [ - 8元素數組元素為9元素數組 - * - 9元素數組元素為指針 - ( - 為函數指針 - * - 函數返回值為指針 - [ - 指針指向5元素數組 - int - 數組元素為int
int (* (* func)(int * p))[5];
分析: func - * - func是指針 - ( - 是函數指針 - * - 函數返回值為指針 - [ - 指針指向5元素數組 - int - 數組元素為int
01
指針函數通常是指函數返回值是指針的一類函數,如圖所示。
02
函數指針是指指向某個具體函數的指針變量,在程序設計時可以用來調用某個特定函數或者做某個函數的參數。其形式一般如圖:
03
指針函數與函數指針本質上的區別是,指針函數是一個帶指針的函數,總的來說還是一個函數,如圖就是一個帶*name指針的函數
04
函數指針是指向函數的指針變量,本質上還是一個指針,其格式如下,可以看到和指針函數的格式非常像,所以一定要用心留意。
網站標題:c語言指針函數基礎,c語言指針函數的用法
鏈接地址:http://vcdvsql.cn/article44/hsophe.html
成都網站建設公司_創新互聯,為您提供關鍵詞優化、響應式網站、Google、、網站制作、網站設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯