1. 程式人生 > >簡單理解—指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標

簡單理解—指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標


簡單理解—指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標


指標陣列

指標陣列,顧名思義是”指標的陣列”,首先這個變數是一個陣列,其次,”指標”修飾這個陣列,意思是說這個陣列的所有元素都是指標型別,在32位系統中,指標佔四個位元組。

舉個例子:


char *str[4] = {"hello", "world", "work", "hard"};
//str就是我定義的一個指標陣列,它有四個元素,每個元素是一個char *型別的指標,這些指標存放著其對應字串的首地址

為什麼這樣定義呢?

這裡就需要對優先順序

有一定的瞭解,因為 [] 的優先順序高於 * ,所以 str 先與 [] 結合,表示這是一個數組變數,有四個元素。之後我們可以將 str[4] 去掉,就剩下了 char * ,表示這個陣列中存放的是char * 型別的指標

陣列指標

陣列指標,顧名思義是”陣列的指標”,首先這個變數是一個指標,其次,”陣列”修飾這個指標,意思是說這個指標存放著一個數組的首地址,或者說這個指標指向一個數組的首地址。

舉個例子:

char *str[4] = {"hello", "world", "work", "hard"};
char *(*pstr)[4] = str;
//pstr就是我定義的一個數組指標,它存放著陣列str的地址
//str陣列有四個元素,每個元素是一個char *型別的指標,這些指標存放著其對應字串的首地址

為什麼這樣定義呢?

因為 [] 的優先順序高於 * ,所以需要加上()來保證 pstr 先與 * 結合,表示這是一個指標變數,它存放著陣列str的地址。之後我們可以將 * pstr 去掉,就剩下了 char * [4] ,表示這個指標指向的是一個數組,這個數組裡面存放了四個char * 型別的指標

函式指標

函式指標,顧名思義是”函式的指標”,也就是指向函式地址的一個指標變數

舉個例子:


int Add(int x, int y)
{
    return
x + y; } int main() { int a = 1; int b = 2; int (*pfun)(intint) = Add(a, b); //Add是一個簡單的加法函式 //pfun就是我定義的一個函式指標,它存放著函式Add的地址 printf("%d\n", pfun); return 0; }

為什麼這樣定義呢?

同樣的,因為 () 的優先順序高於 * ,所以需要加上()來保證 pfun 先與 * 結合,表示這是一個指標變數,它存放著函式Add的地址。之後我們可以將 * pfun 去掉,就剩下了 int () ,表示這個指標指向的是一個函式,這個函式有兩個int型引數,它的返回值為int型別。

函式指標陣列

函式指標,顧名思義是”函式指標的陣列”,也就是一個用來存放函式指標的陣列
函式指標的用途:轉移表

舉個例子:(計算器)


#include <stdio.h>

int Add(int x, int y)
{
    return x + y;
}

int Sub(int x, int y)
{
    return x - y;
}

int Mul(int x, int y)
{
    return x * y;
}

int Div(int x, int y)
{
    if (y == 0)
    {
        return 'F';
    }
    else
    {
        return x / y;
    }
}

int main()
{
    int a = 0;
    int b = 0;
    int input = 1;
    char ret = 0;
    int(*p[5])(int a, int b) = { 0, Add, Sub, Mul, Div }; 
    //
    //轉移表
    //p就是我定義的一個函式指標陣列,它有五個元素,每個元素是一個函式指標,這些指標存放著其對應函式的地址
    while (input)
    {
        printf("**********************************\n");
        printf("***** 1.Add            2.Sub *****\n");
        printf("***** 3.Mul            4.Div *****\n");
        printf("*****         0.Quit         *****\n");
        printf("**********************************\n");
        printf("\n請選擇:");
        scanf("%d", &input);
        if (input >= 1 && input <= 4)
        {
            begin:
            printf("\n請輸入運算元:");
            scanf("%d %d", &a, &b);
            ret = p[input](a, b);
            if (ret == 'F')
            {
                printf("\n輸入有誤,請重新輸入\n");
                goto begin;
            }
            else
            {
                printf("\nret = %d\n\n", ret);
            }
        }
        else if (input == 0)
        {
            printf("\n退出\n\n");
        }
        else
        {
            printf("\n選擇錯誤\n\n");
        }
    }
    return 0;
}

指向函式指標陣列的指標

如何定義?


void test(int x)
{
    printf("hehe\n");
}

int main()
{
    //函式指標pfun
    void(*pfun)(int) = test;
    //函式指標陣列pfunarr
    void(*pfunarr[5])(int);
    pfunarr[0] = test;
    //指向函式指標陣列pfunarr的指標ppfunarr
    void(*(*ppfunarr)[10])(int) = &pfunarr;
    return 0;
}