指向函式的指標與指向指標的指標
1、指向函式的指標
可以用指標變數指向整型變數、字串、陣列,也可以指向一個函式。一個函式在編譯時被分配給一個入口地址。這個函式中的入口地址就稱為函式的指標。
例:比較a和b的大小,求大值。
#include<stdio.h> #include "StdAfx.h" int max(int x,int y) { int z; if(x>y) { z=x; } else { z=y; } return z; } void main() { int max(int,int); int (*p)(int,int); int a,b,c; p = max; scanf("%d%d",&a,&b); c=(*p)(a,b); printf("a=%d,b=%d,max=%d",a,b,c); }
用指向函式的指標作函式引數
函式指標變數常用的用途之一是指標作為引數傳遞到其他函式,以實現函式地址的傳遞,這樣就能在被呼叫的函式中使用實參函式。
例:
#include<stdio.h> #include "StdAfx.h" void sub(int(*x1)(int),int(*x2)(int,int))/**x1與*x2分別為兩個函式f1,f2的地址*/ { int a,b,i,j; a=(*x1)(i);/*呼叫f1函式*/ b=(*x2)(i,j);/*呼叫f2函式*/ …… }
返回指標值的函式
一般形式為*函式名 (引數表列);
例:有若干個學生的成績(每個學生有4門課程),要求在使用者輸入學生序號後,能輸出該學生的全部成績,用指標函式實現。
#include<stdio.h> #include "StdAfx.h" void main() { double score[][4]={{65,45,12,78},{45,45,88,65},{65,78,98,46},{78,45,96,93}}; double *search(double(*pointer)[4],int n); double *p; int i,n; scanf("%d",&n); printf("The scores of No.%d are:\n",n); p=search(score,n); for(i=0;i<4;i++) { printf("%5f\t",*(p+i)); } printf("\n"); } double *search(double(*pointer)[4],int n) { double *pt; pt=*(pointer+n); return pt; }
指標函式與函式指標的區別:
指標函式時指帶指標的函式,即本質是一個函式。
函式指標是指函式的指標變數,因而函式指標本身首先應是指標變數,該指標變數指向函式。
指標陣列和指向指標的指標
指標陣列:一個數組,若元素均為指標型別資料,稱為指標陣列。
一維指標陣列定義形式:型別名 *陣列名[陣列長度];
例:int *name[4];
例:
#include<stdio.h> #include "StdAfx.h" void main() { int a[5]={1,2,3,4,5}; int *name[5]={&a[0],&a[1],&a[2],&a[3],&a[4]}; int i; for(i=0;i<5;i++) { printf("%d",*name[i]); } }
指向指標的指標
形式:char **p;
說明:p前面有兩個‘*‘號,*運算子的結合性是從右到左,因此**p相當於*(*p),顯然*p是指標變數的定義形式。
例:
#include<stdio.h> #include "StdAfx.h" void main() { char *name[]={"I love China","NIT","I love you"}; char **p; int i; for(i=0;i<3;i++) { p=name+i; printf("%s\n",*p); } }