函式指標
函式指標陣列
指向函式指標陣列的指標
指標陣列,即指標的陣列, 它不是指標,而是乙個存放指標的陣列,陣列的每乙個元素都是指標型別的,例如下面的都是指標陣列:
int *arr[10];//指標陣列,10元素,每個元素都是整型指標型別的
char *arr[4];//指標陣列,4個元素,每個元素都是字元指標型別的
char **arr3[5];//指標陣列,5個元素,每個元素都是二級指標型別的
由於[ ]的優先順序要比*的優先順序高,所以陣列名先和[ ]結合,所以它的本質是陣列,而它每乙個元素都是指標型別的,所以指標陣列的每乙個元素都佔四個位元組。##陣列指標
int (*p)[10];
解釋:p先和*結合,說明p是乙個指標變數,然後指向的是乙個大小為10個整型的陣列。所以p是乙個指標,指向的是乙個陣列,叫做陣列指標。 ####陣列指標的使用 我們了解了陣列指標的定義,那麼陣列的位址如何來儲存?int arr[10]=;
int*p1=&arr;
int (*p2)[10]=&arr;
這三種哪一種比較合適呢?我們知道:整型變數的位址應該放在整型指標裡面去
字元變數的位址應該放在字元指標裡面去 所以陣列變數的位址應該放在陣列指標裡面去
void print(int(*p)[5], int x, int y)//二維陣列的引數(*p)[5]相當於p[5]
//p是指標指向首元素位址,也就是第一行的位址,+i就是第幾行的位址,解引用就是首元素位址,再+j,就是每個元素的位址,再解引用就是每個元素了
printf("\n");
}}int main()
;//二維陣列
print(arr, 3, 5);
return
0;}
執行結果如下:
陣列指標的應用一般都是二維陣列傳參的時候用
上面我們了解了指標陣列和陣列指標,接下來我們辨認一下,下面每個分別是什麼?
int arr[5];
int*parr1[10];
int(*parr2)[10];
int(*parr3[10])[5];
1.很簡單,是我們經常見到的一維陣列2.是上面我們了解到的指標陣列
3.也是上面我們知道的陣列指標
那麼第四個到底是什麼呢?我們分析一下:
首先parr3是乙個陣列,因為它和[10]靠的近,陣列有10個元素,再從外面看,他是乙個陣列指標,有5個元素,每個元素是整型,**如下:
通過上面的了解,我們應該進一步知道函式指標,是指向函式的指標,用來存放函式的位址,那麼說明函式也是有位址的,那麼我們怎麼取出函式的位址呢?上面解釋了函式指標及其定義,我們知道了函式指標是存放函式位址的,那麼如果我們把函式指標的位址存到乙個陣列中,那這個陣列就叫做函式指標陣列,那麼函式指標陣列應該如何定義呢?下面哪種定義方式是正確的?可見,取出的確實是這個函式的位址,&函式名是整個函式的位址,那麼函式名難道是首元素的位址嗎?顯然函式我們無法談論首元素,所以在函式取位址的時候&加函式名或是直接函式名取出的都是函式的位址,如下:
了解了函式的位址,那麼我們應該如何將函式的位址儲存起來,這就要用到函式指標了
我們看如下**:
第乙個是函式的宣告,而第二個則是函式指標,所以如果我們想把上面的test()這個函式的位址儲存起來,就可以用函式指標void (*p)()來儲存。下面舉出函式指標定義的例子:void *p();//p先和()結合,所以是乙個函式
void (*p)();//p先和*結合,所以是乙個指標
解讀兩段有趣的**:int add(int
x, inty)
int main()
**二:①signal是一次函式宣告//**一:
(*(void(*)())0)();
//**二:
void(*signal(int,void(*)(int)))(int)
②signal函式的引數,第乙個是int,第二個是函式指標,該函式指標指向的函式引數為int,返回型別為void
③signal函式的返回型別為乙個函式指標,該函式指標指向的引數是int,返回型別是void
答案是parr1,parr1先和[ ]結合,說明parr1是陣列,陣列的內容則是int (*)()型別的函式指標int (*parr1[10])();
int *parr2[10]();
int (*)() parr3[10];
函式指標陣列的用途:轉移表
實現計算器:
方法一:函式呼叫
一般情況下,我們實現兩個數的加減乘除會像下面這種方式寫:
方法二:使用函式指標陣列int add(int a, int b)
intsub(int a, int b)
int mul(int a, int b)
int div(int a, int b)
int main()
printf("ret=%d\n", ret);
}return
0;}
執行結果如下:int add(int x, int y)
int sub(int x, int y)
int mul(int x, int y)
int div(int x, int y)
void menu()
void calc(int(*pfun)(int, int))//函式指標
//int main()
;//定義乙個函式指標陣列,裡面有5個元素,每個元素分別是乙個函式
do
} while (input);
return
0;}
指向函式指標陣列的指標是乙個指標,指標指向乙個陣列,陣列的元素都是函式指標;那麼指向函式指標陣列的指標又該如何定義呢?void test(const
char *str)
int main()
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...