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

理解 指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標

一、指標陣列與陣列指標先看兩行程式碼,猜猜哪個是陣列,哪個是指標

int *p[5];

int (*p)[5];

有沒有很簡單,但是有很多初學者很是分不清楚;第一個是指標陣列,第二個是陣列指標。且看小僧給大家捋一捋,首先要明白符號優先順序問題,“[ ]”的優先順序高於“*”,所以p先和誰結合就表示誰。"int *p[5]" p先和[ ]結合,理所當然是陣列了,只不過陣列元素為 int * 型;"int (*p)[5]" “()”的優先順序高於“[ ]”,p先和“*”結合,理所當然是指標,只不過該指標指向 int 型陣列的內容,是不是搜一賊。

指標陣列:首先他是一個數組,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。

陣列指標:首先他是一個指標,他指向一個數組。是不是很難懂,且看下圖

希望你們看了不會太暈

二、函式指標,函式指標陣列

     函式指標,看到這裡你肯定會照貓畫虎,(首先他是一個指標,他指向一個函式)很對,就是這樣的。接下來我們細細研究,先看張圖

來幾片程式碼瞧一瞧

(1) char *(*fun1)(char *p1,char *p2);(2) char * *fun2(char p1,char p2);

有沒有很複雜的樣子,第一題看起來像函式,其實他是函式指標,fun1是指標變數,他指向一個函式。這個函式有兩個指標型別的引數,返回值為 char * 型;第二題看起來像指標,其實他是一個函式,fun2是函式名,引數為兩個指標,返回值為 char 型二級指標。 函式指標也很簡單吧,其實他和普通指標一樣,我們使用他的好處在於,可以將實現同一功能的多個模組統一起來標識,這樣可以使函式的介面與實現分開。

三、函式指標陣列,函式指標陣列指標有了上面了的基礎我們很容易掌握這兩個

函式指標陣列:首先它是一個數組,陣列元素為函式指標。(不幹說,還是來個栗子:char *(* a[4])(char *p);它是一個數組,陣列名為 a ,陣列內有四個指向函式的指標;這個指標指向一些返回值型別為指向字元的指標,引數為指向字元的指標的函式。)

函式指標陣列指標:首先它是一個指標,這個指標指向陣列,這個數組裡面存的都是指向函式的指標。(不怕,來個栗子就好了:char (*(* a)[4])(char *p); 這個指標指向包含了4個元素的陣列;這個數組裡面存的是指向函式的指標;這個指標指向一些返回值型別為指向字元的指標,引數為指向字元的指標的函式。

來個例子看看他們的威力:

#include <stdio.h>
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a*b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //轉移表
		while (input)
		{
			printf( "*************************\n" );
			printf( " 1:add 2:sub \n" );
			printf( " 3:mul 4:div \n" );
			printf( "*************************\n" );
			printf( "請選擇:" );
			scanf( "%d", &input);
			if ((input <= 4 && input >= 1))
			{
				printf( "輸入運算元:" );
				scanf( "%d %d", &x, &y);
				ret = (*p[input])(x, y);
			}
			else
				printf( "輸入有誤\n" );
			printf( "ret = %d\n", ret);
		}
		return 0;
}
這計算器還可以吧,看看運算結果如何

四、叨叨幾句,不要看起來很複雜,其實學起來也複雜,但是學懂了會很有趕腳。 好好學習,天天向上大笑
初學者歡迎大家指正