深入理解 [指標函數] 、[函數指標]、[指標的指標]、[指向指標數組的指標]__函數

來源:互聯網
上載者:User

指標函數

1、指標函數是指帶指標的函數,即本質是一個函數。當一個函式宣告其傳回值為一個指標時,實際上就是返回一個地址給調用函數,以用於需要指標或地址的運算式中。

函數傳回型別是某一類型的指標:

格式:

類型標識符  *函數名(參數表)

int *match(void *key_x,void *key_y);

解析:首先來說它是一個函數,只不過這個函數的傳回值是一個地址值。函數傳回值必須用同類型的指標變數來接受,也就是說,指標函數一定有函數傳回值,而且,在主調函數中,函數傳回值必須賦給同類型的指標變數

例如:

float *match();

float *p;

p = match(a);


重要知識點:
注意指標函數與函數指標表示方法不同,千萬不要混淆。最簡單的辨別方式就是看函數名前面的指標*號有沒有被括弧()包含,如果被包含就是函數指標,反之則是指標函數。


指標函數

2、函數指標是指向函數的指標變數,即本質是一個指標變數。

函數指標三指向可執行程式碼片段或調用可執行程式碼片段的資訊塊的指標,而不是指向某種資料的指標。函數指標將函數當作普通的資料那樣儲存和管理。


格式如下:

類型說明符 (*函數名)(參數)

int (*match) (int x); /* 聲明一個函數指標 */

int *f = match; /* 將match函數的首地址賦給指標f */


PS:

其實這裡不能稱為函數名,應該叫做指標的變數名。這個特殊的指標指向一個返回整型值的函數。指標的聲明必須和它指向函數的聲明保持一致。

指標名和指標運算子外面的括弧改變了預設的運算子優先順序。如果沒有圓括弧,就變成了一個返回整型指標的函數的原型聲明。

例如:

void (*fptr)();

把函數的地址賦值給函數指標,可以採用下面兩種形式:

   fptr = &Function;
   fptr = Function;

取地址運算子&不是必需的,因為單單一個函數標識符就標號表示了它的地址,如果是函數調用,還必須包含一個圓括弧括起來的參數表。

可以採用如下兩種方式來通過指標調用函數:

 x = (*fptr)();
     x = fptr();
第二種格式看上去和函數調用無異。但是推薦使用第一種格式,因為它明確指出是通過指標而非函數名來調用函數的。

函數指標和指標函數最主要的區別是一個是指標變數,一個是函數。


指標的指標 

三、指標的指標

例如:
    char ** data;

如果有三個星號,那就是指標的指標的指標,四個星號就是指標的指標的指標的指標,依次類推。當你熟悉了簡單的例子以後,就可以應付複雜的情況了。在實際程式中,一般也只用到二級指標,三級指標和四級指標就很少用啦。


指標的指標需要用到指標的地址。


    char c = 'A';
    char *p = &c;
    char **data= &p;


通過指標的指標,不僅可以訪問它指向的指標,還可以訪問它指向的指標所指向的資料。下面就是幾個這樣的例子:
    char *p1=*cp;
    char c1=**cp;
利用指標的指標可以允許被調用函數修改局部指標變數和處理指標數組,參考網上的例子:


void FindCredit(int **);main(){    int vals[]={7,6,5,-4,3,2,1,0};    int *fp=vals;    FindCredit(&fp);    printf(%d\n,*fp);}void FindCredit(int ** fpp){    while(**fpp!=0)    if(**fpp<0) break;    else (*fpp)++;}

首先用一個數組的地址初始化指標fp,然後把該指標的地址作為實參傳遞給函數FindCredit()。FindCredit()函數通過運算式**fpp間接地得到數組中的資料。為遍曆數組以找到一個負值,FindCredit()函數進行自增運算的對象是調用者的指向數組的指標,而不是它自己的指向調用者指標的指標。語句(*fpp)++就是對形參指標指向的指標進行自增運算的。但是因為*運算子高於++運算子,所以圓括弧在這裡是必須的,如果沒有圓括弧,那麼++運算子將作用於二重指標fpp上。

指向指標數組的指標

四、指向指標數組的指標
    指標的指標另一用法就是處理指標數組。其中最常見的一個用法就是處理字串。

 char *Names[]={     zhangsan,     lisi,      wangwu,      maliu,      fu,      0     };main(){  char **nm=Names;  while(*nm!=0)   printf(%s\n,*nm++);}


先用字元型指標數組Names的地址來初始化指標nm。每次printf()的調用都首先傳遞指標nm指向的字元型指標,然後對nm進行自增運算使其指向數組的下一個元素(還是指標)。注意完成上述認為的文法為*nm++,它首先取得指標指向的內容,然後使指標自增。

數組中的最後一個元素被初始化為0,while迴圈一次來判斷是否到了數組末尾。具有零值的指標常常被用做迴圈數組的終止符。其中零值指標為空白指標(NULL)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.