1. 程式人生 > >C語言:理解函式指標陣列和定義

C語言:理解函式指標陣列和定義

  • 函式指標陣列和定義

陣列是一個存放相同型別資料的儲存空間,那我們已經學習了指標陣列,比如:

     int *arr[10];//陣列的每個元素是int*

那要把函式的地址存到一個數組中,那這個陣列就叫函式指標陣列,那函式指標的陣列如何定義呢?

  int (*parr1[10])();

分析:parrl先和[]結合,說明parr1是陣列,陣列的內容是什麼呢?是int (*)() 型別的函式指標。

舉例:

# include <stdio.h>
# include <stdlib.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)
{
	return x/y;
}

int main()
{
	int(*p[4])(int, int) = { Add,Sub,Mul,Div};
	int i = 0;
	for (i = 0; i < 4; i++)
	{
	printf("%d\n",p[i](8, 4));
	}
	system("pause");
		return 0;
}
  • 轉移表 

一看到轉移這兩個字,就會想到和狀態有關,實際中通常是用 if-else語句或者switch語句進行一些狀態的切換,如果遇到比較複雜的情況,轉移次數可能會達到數百次或者數千次,如果再使用if-else語句或者switch語句,維護起這個軟體系統,工作量將會相當的大。這個時候就可以採用“轉移表”來避免這種情況。

舉例:計算器

# include <stdio.h>
# include <stdlib.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)
{
	return x/y;
}


int main()
{
	int a, b;
	int input = 1;
	int ret = 0;
	int(*p[5])(int a, int b) = {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_s("%d", &input);
		if ((input<5 && input>0))
		{
			printf("輸入運算元:>");
			scanf_s("%d %d", &a,&b);
			ret = (*p[input])(a, b);
		}
		else
		{
			printf("輸入有誤\n");
		}
			printf("ret=%d\n", ret);
	}
	system("pause");
		return 0;
}
  • 指向函式指標陣列的指標 

指向函式指標陣列的指標:指向函式指標陣列的指標是一個指標,指標指向一個數組,陣列的元素都是函式指標;

如何定義?

   void test(const char* str)
{
      printf("%s\n", str);    
}
 int main( )
{
      void (*pfun) (const char*) = test;//函式指標pfun

      void (*pfunArr[51)(const char* str); pfunArr[0] = test;//函式指標的陣列pfunArr

      void (*(*ppfunArr)[10])(const char*) = &pfunArr;return 0;   //.指向函式指標陣列pfunArr的指標ppfunArr.