1. 程式人生 > >指標與陣列,指標與函式之間的關係

指標與陣列,指標與函式之間的關係

指標陣列和陣列指標

指標陣列,它的關鍵在於是一個數組,即陣列中每個元素都是指標。
陣列指標,他的關鍵在於是指標變數,即這個指標指向一個數組。

#include<stdio.h>
int main ()
{
    int arr [4] = {0};//這是一個數組,大家都知道。
    int *parr1[4];//這是指標陣列,首先[]的優先順序比*的優先順序高,所以parr
                 //先與[]結合,它是一個數組,然後再與*結合,即陣列中的
                 //每個元素都是指標。
    int (*parr2)[4];//這是陣列指標,因為()的優先順序比[]的高
//所以parr是一個指標變數,然後與[]結合 //所以,這是陣列指標。 int *(*parr3)[4];//較為複雜一點的陣列指標,首先parr3是一個指標變數, //然後與[]結合,變為陣列指標,而前面又有*,所以它可以指 //向一個大小為3個元素的陣列,每個元素是指標。 }

函式指標

函式指標就是函式的指標,他是一個指標,指向一個函式。

#include <stdio.h>
#include <string.h>
char* fun (char *p1,char *p2) { int tmp = 0; tmp = strcmp(p1,p2); if (tmp==0) { return p1; } else { return p2; } } int main () { char *(*pfun)(char *p1,char *p2); pfun = &fun; (*pfun)("aa","bb"); return 0;}//這個例子就很好的解釋了函式指標這個定義。我們清楚表示式
//"char*(*pfun)(char*p)"定義的是一個函式指標pfun。 //首先通過(*pfun)取出存在這個地址上的函式,然後呼叫。

函式指標的陣列

函式指標的陣列,它是一個數組,陣列中的每個元素是一個函式指標,這個指標可以指向一個函式。

#include <stdio.h>
#include <string.h>
char *fun1(char*p)
{
    printf ("%s\n",p);
    return p;
}
char *fun2 (char *p)
{
    printf ("%s\n",p);
    return p;
}
char *fun3 (char*p)
{
    printf ("%s\n",p);
    return p;
}
int main ()
{
    char *(*pfun[4])(char *p)//這裡的表示式表示的就是函式指標的陣列
    pfun[1] = fun1;//可以直接用函式名錶示地址
    pfun[2] = &fun2;//也可以在函式名前加取地址符號。
    pfun[3] = &fun3;

}

函式指標陣列的指標

它指的還是一個指標,只不過這個指標指向一個數組,這個數組裡的元素是可以指向函式的指標,有點繞。

void (*(*pfun)[3])(char *)//首先pfun是一個指標變數,然後指向一個數組,這個
                         //陣列有三個元素,這幾個元素可以指向函式的指標,函式
                         //的引數是char *,返回值為 void