1. 程式人生 > >函式指標、函式返回指標、const指標、指向const指標,指向const的const指標。

函式指標、函式返回指標、const指標、指向const指標,指向const的const指標。

函式指標

函式指標是指向函式的指標變數。 因而“函式指標”本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。如前所述,C在編譯時,每一個函式都有一個入口地址,該入口地址就是函式指標所指向的地址。有了指向函式的指標變數後,可用該指標變數呼叫函式,就如同用指標變數可引用其他型別變數一樣,在這些概念上是一致的。函式指標有兩個用途:呼叫函式和做函式的引數。

函式指標的宣告方法為:
    函式型別 (標誌符指標變數名) (形參列表);
    注1:“函式型別”說明函式的返回型別,“(標誌符指標變數名 )”中的括號不能省,若省略整體則成為一個函式說明,說明了一個返回的資料型別是指標的函式,後面的“形參列表”表示指標變數指向的函式所帶的引數列表。例如:

int func(int x); /* 宣告一個函式 */
int (*f) (int x); /* 宣告一個函式指標 */
f=func; /* 將func函式的首地址賦給指標f */
賦值時函式func不帶括號,也不帶引數,由於func代表函式的首地址,因此經過賦值以後,指標f就指向函式func(x)的程式碼的首地址。

下面的程式說明了函式指標呼叫函式的方法:

#include<stdio.h>
int max(int x,int y){ return(x>y?x:y); }
int main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}

ptr是指向函式的指標變數,所以可把函式max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以後就可以用ptr來呼叫該函式,實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指標變數,不像函式名稱那樣是死的,它可以指向任何函式,就看你想怎麼做了。在程式中把哪個函式的地址賦給它,它就指向哪個函式。而後用指標變數呼叫它,因此可以先後指向不同的函式。不過注意,指向函式的指標變數沒有++和--運算,用時要小心。

②函式返回指標

void* f( )

③const指標

當使用帶有const的指標時其實有兩種意思。一種指的是你不能修改指標本身的內容,另一種指的是你不能修改指標指向的內容。

const指標,它的意思是指標本身的值是不能被修改的。它只有一種寫法

int* const p=一個地址; (因為指標本身的值是不能被修改的所以它必須被初始化)
這種形式可以被理解為,p是一個指標,這個指標是指向int 的const指標。它指向的值是可以被改變的如*p=3;

④指向const指標

指向const的指標,它的意思是指標指向的內容是不能被修改的。它有兩種寫法。
 const int* p; (推薦)
 int const* p;
第一種可以理解為,p是一個指標,它指向的內容是const int 型別。p本身不用初始化它可以指向任何標示符,但它指向的內容是不能被改變的。
第二種很容易被理解成是p是一個指向int的const指標(指標本身不能被修改),但這樣理解是錯誤的,它也是表示的是指向const的指標(指標指向的內容是不能被修改的),它跟第一種表達的是一個意思。為了避免混淆推薦大家用第一種。

⑤指向const的const指標

這個指標本身和它指向的內容都是不能被改變的。
 const int* const p=一個地址;
 int const* const p=一個地址;

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    int a=3;
    int b;
      
   /*定義指向const的指標(指標指向的內容不能被修改)*/ 
   const int* p1; 
   int const* p2; 
     
   /*定義const指標(由於指標本身的值不能改變所以必須得初始化)*/ 
   int* const p3=&a; 
     
   /*指標本身和它指向的內容都是不能被改變的所以也得初始化*/
   const int* const p4=&a;
   int const* const p5=&b; 
     
    p1=p2=&a; //正確
    *p1=*p2=8; //不正確(指標指向的內容不能被修改)
     
    *p3=5; //正確
    p3=p1; //不正確(指標本身的值不能改變) 
     
    p4=p5;//不正確 (指標本身和它指向的內容都是不能被改變) 
    *p4=*p5=4; //不正確(指標本身和它指向的內容都是不能被改變) 
      
   return 0; 
}