深入理解指標之高階指標

2021-08-20 04:44:40 字數 2149 閱讀 6138

在指標中,還有指標陣列、陣列指標、函式指標、函式指標陣列、函式指標的陣列的指標這樣一些高階指標,所以我們需要了解並掌握它們的含義和用法:

我們得先知道,  指標是和陣列無關的:

1.指標是一種型別;陣列也是一種型別;

2.指標可作左值,陣列名卻不可以;

一、指標陣列

int *arr1[10];

char *arr2[4];

char **arr3[5];

如上,便是指標陣列,

那麼指標陣列是陣列還是指標?

#是陣列,   

這取決於它的優先順序,因為的優先順序高於*,所以他先和結合,因此首先它是陣列,又因為前面有*,所以是指標陣列;

二、陣列指標

同理,陣列指標便是指標,

如:int (*p)[10]

由於p先和*結合,所以p是乙個指標變數,且指向乙個大小為10個整形的陣列;

注意:由於的優先順序高於*,所以需要加上()來保證p先和*結合。

int arr[10] = ;

int(*p2)[10] = &arr;

三、函式指標首先看一段**:

#includevoid test()

int main()

再來看看結果,

結果是一樣的,所以:

函式的位址通常由函式名表示(函式的位址為第一條語句的位址),

我們想要儲存函式的位址,則用  

void(*pfun1)();
注:pfun1先和*結合,說明pfun1是指標,指標指向乙個函式,指向的函式無引數,返回值型別為void。

擴充套件:我們來看兩個有趣的**。

//**一

(*(void(*)())0)();

分析:首先我們看到0前面加了括號,則說明這是對0進行強轉,而括號裡面很明顯是乙個函式指標,所以是將0強轉為函式指標,又因為函式指標是位址,所以0是4個位元組的位址(返回值為void,引數為空的函式的位址),然後再進行解引用,就是函式呼叫。

//**二

void(*signal(int, void(*)(int)))(int);

分析:

由於優先順序的原因,所以signal先和括號結合,前面是*,可知signal是函式名,且是乙個引數為int,另乙個引數為函式指標的函式,再進行函式呼叫。

四、函式指標陣列

函式指標陣列就是把函式的位址存到乙個陣列中

如:

int (*parr1[10])();
函式指標陣列的應用: 

使用函式指標實現轉移表

我們直接來看**,

#include#include#pragma warning(disable:4996)

int my_add(int x, int y)

int my_sub(int x, int y)

int my_mul(int x, int y)

int my_div(int x, int y)

else }

void menu()

int main()

; while (select)

else if (select >= 1 && select <= 4)

else

printf("ret=%d\n", ret);

} system("pause");

return 0;

}

這樣實現轉移表則可以使程式比較簡潔。

五、指向函式指標陣列的指標

它是乙個指標,可以指向乙個元素都是函式指標的陣列。

如:

void(*(*ppfunarr)[10])(const char *) = &pfunarr;
ppfunarr是乙個指向函式指標陣列pfunarr的指標。

深入理解指標

指標 是乙個特殊的變數 它裡面儲存 的數值被解釋成為記憶體裡的乙個位址 指標也是一種資料型別,並且也是有值的。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 ...

深入理解指標

指標 是乙個特殊的變數 它裡面儲存 的數值被解釋成為記憶體裡的乙個位址 指標也是一種資料型別,並且也是有值的。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 ...

深入理解指標

指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標做例子 例一 1 in ptr 2 char ptr...