- 示列:
```int board[8][8]; //宣告乙個內含陣列的陣列
int ** ptr; //宣告乙個指向指標的指標,被指向的指標指向int
int * risks[10]; //宣告乙個內含10個元素的陣列,每個元素都是乙個指向int的指標
int (* rusks)[10]; //宣告乙個指向陣列的指標,該陣列內含10個int型別的值
int (* uuf)[3][4]; //宣告乙個3 x 4的二維陣列,每個元素都是指向int的指標
int (* uuf)[3][4]; //宣告乙個指向3 x 4二維陣列的指標,該陣列中內含int型別的值
int (* uuf[3])[4]; //宣告乙個內含3個指標元素的陣列,其中每個指標都指向乙個內含4個int型別元素的陣列。
```- `*`、`()`、``的優先順序及結合規則:
1. 陣列名後面的``和函式名後面的`()`具有相同的優先順序。比`*`的優先順序高。
2. 從左往右結合。
- 根據這些規則可進行如下形式的宣告:
char * fump(int); //返回字元指標的函式
char (* frump)(int); //指向函式的指標,該函式的返回型別為char
char (* flump[3])(int); //內含3個指標的陣列,每個指標都指向返回值為char的函式
函式和指標
#### 什麼是函式指標
- 函式也有位址,因為函式的機器語言實現由載入記憶體的**組成。
- 指向函式的指標中儲存著**函式**的起始處的位址**。
#### 宣告函式指標
> 宣告資料指標時,必須宣告指標所指向的資料型別。
> 同樣,宣告函式指標時,**必須宣告函式指標指向的函式型別**;為了指明函式型別,要指明函式簽名(即,函式的返回型別和引數型別)。
eg:有下面函式原型:
void toupper(char *); //把字串中的字元轉換成大寫字元
toupper()函式的型別是帶`char *`型別引數,返回型別是`void`的函式。
宣告乙個指標pf指向該函式類別:
void (pf)(char); //pf是乙個指向函式的指標;把函式名toupper替換成表示式(*pf)
宣告乙個指向某型別函式的指標 最簡單的方式:
1. 寫出該函式的原型
2. 把函式名替換成(`*pf`)形式的表示式。即可建立函式指標宣告(pf為指向該型別函式的指標)。
使用typedef:
typedef void (*v_fp_charp)(char *);
void show (v_fp_charp fp, char *);
v_fp_charp pfun
note:
void *pf(char *); //pf不是函式指標,是乙個返回字元指標的函式
void toupper(char *);
void tolower(char *);
int round(double);
void (*pf)(char *);
pf = toupper; //有效
pf = tolower; //有效
pf = round; //無效,round與指標型別不匹配
pf = tolower(); //無效,tolower()不是位址,且tolower()的返回值是void,沒有返回值,不能在賦值語句中進行賦值。
#### 使用函式指標
> 可以使用資料指標訪問資料,同樣也可以使用**函式指標訪問函式**
- 存在兩種語法:兩種用法都可以
eg: ```
void toupper(char *);
void tolower(char *);
void (*pf)(char *);
char mis = "nina metier";
pf = toupper;
(*pf)(miss) //把toupper作用於語法1
pf = tolower;
pf(miss); //把tolower作用於語法2
```- 語法1:由於pf指向toupper函式,`*pf`相當於toupper函式,所以`(*pf)(miss)`和`toupper(miss)`相同;從宣告可看出toupper和`*pf`是等價的。
- 語法2:由於函式名是指標,所以指標和函式名可以互換使用,所以`pf(miss)`和`tolower(miss)`相同;從pf的賦值表示式語句可看出tolower和pf是等價的
- 歷史原因:貝爾實驗室的c和unix採用的是語法1,伯克利的unix採用的是語法2;為保證相容,ansi c認為`(*pf)(miss)`與`pf(miss)`等價。
- 函式指標的常見用法:
1. 作為函式的引數:
```void show(void (* fp)(char *), char * str); //宣告了兩個形參,fp--函式指標(fp指向的函式接受char *型別的引數,返回值為void),str--資料指標(str指向乙個char型別的數值)
//呼叫函式:
show(tolower, miss); //show()使用tolower()函式:fp = tolower
show(pf, miss); //show()使用pf指向的函式: fp = pf
//show()函式定義
void show(void (* fp)(char *), char * str)
```note:帶返回值的函式作為引數傳遞給另乙個函式有兩種方式:
function1(sqrt); //傳遞sqrt函式的位址; 假設function1()**中會使用該函式
function2(sqrt(4.0)); //傳遞sqrt函式的返回值; 先呼叫sqrt()求值,把返回值傳遞給function2()
#### 使用函式名的4種方法:定義函式、宣告函式、呼叫函式、作為指標
int comp(int x, int y); //函式原型中的函式名
status = comp(q, r); //函式呼叫中的函式名
int comp(int x, int y) //函式定義中的函式名
pfunct = comp; //在賦值表示式語句中,作為指標的函式名
slowsort(arr, n, comp); //作為指標引數的函式名
C 指標函式和函式指標
1 指標函式 1 基本概念 指標函式 顧名思義就是帶有指標的函式,即其本質是乙個函式,只不過這種函式返回的是乙個對應型別的位址。2 定義式 type func type type 如 int max int x,int y 3 例子詳解 cpp view plain copy 1.include 2...
c 指標函式和函式指標
函式指標與指標函式 1 函式指標 形式 返回型別 函式名 參數列 一種特殊的指標,它指向函式的入口 定義乙個函式指標p,只能指向返回值為int,形參為兩個int的函式 輸出結果 include stdafx.h include using namespace std int p int,int in...
C 函式指標和指標函式
c 要是不常用,相信過四天你的指標函式與函式指標的概念就該忘個精光。其實只要記住誰在後面誰就是哪個本質。先了解下指標陣列與陣列指標吧 陣列指標 就是指向陣列的指標,它表示的是乙個指標,它指向的是乙個陣列,它的重點是指標,如,int pa 8 宣告了乙個指標,該指標指向了乙個有8個int型元素的陣列 ...