在指標中,還有指標陣列、陣列指標、函式指標、函式指標陣列、函式指標的陣列的指標這樣一些高階指標,所以我們需要了解並掌握它們的含義和用法:
我們得先知道, 指標是和陣列無關的:
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...