C函式和指標

2021-09-19 12:46:27 字數 3305 閱讀 5438

- 示列:

```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型元素的陣列 ...