函式指標、函式返回指標、const指標、指向const指標,指向const的const指標。
阿新 • • 發佈:2019-02-08
①函式指標
函式指標是指向函式的指標變數。 因而“函式指標”本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。如前所述,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;
}