1. 程式人生 > >C語言中函式指標的簡單使用

C語言中函式指標的簡單使用

本文的主要內容目錄:

一、函式指標的引入

二、函式指標的簡單運用

一、函式指標的引入

在C語言當中,指標的使用非常重要的。我們都知道有變數指標,可以通過這個變數指標來訪問這個變數;那麼有沒有函式指標呢,如果有的話能不能通過這個函式指標來訪問這個函式呢?答案是肯定的。在說什麼是函式指標之前,先引入一個簡單的例子,如下所示:

#include <stdio.h>

/* 列印Hello,world! */
void print_hello(void)
{
	printf("Hello,world!\n");
}

/* 程式的入口函式 */
int main(int argc, char *argv[])
{
	void (*fun_ptr)(void);	/* 定義一個指標變數 */

	fun_ptr = print_hello;	/* 賦值並呼叫 */
	fun_ptr();

	return 0;
}
編譯並執行,結果如下:

上面這段程式碼當中void (*fun_ptr)(void); 這個語句的定義是比較奇怪的,但是通過分析發現當對裡面的fun_ptr 賦值為 print_hello這個函式名,然後再fun_ptr()就會打印出來Hello'world!,和直接呼叫print_hello()的結果是一樣的。其實void (*fun_ptr)(void);,就是定義一個函式指標變數,而print_hello這個函式名本身就可以表示這個函式的所在的地址,所以將其賦值給fun_ptr,在呼叫fun_ptr()就可以打印出Hello.world!了。函式指標變數的定義形式如下:

返回值 (*函式指標變數民)(形參列表)
從上面分析可以看出,要想將一個函式的地址賦值給一個函式指標變數必須保證它的返回值、形參列表和要賦值的函式保持一致。

二、函式指標的簡單運用

函式指標的作用在C語言當中是十分巨大的,可以說稍微有一點規模的程式都會涉及到函式指標。本文就結合兩個小例子來簡單說一說函式指標的使用。

1、第一個小例子

讓使用者通過自己輸入選擇來決定是呼叫哪一個函式,根據使用者的輸入對函式指標變數賦值相應的函式地址。具體如下:

#include <stdio.h>

/* 列印Hello,world! */
void print_hello(void)
{
	printf("Hello,world!\n");
}

void print_goodbye(void)
{
	printf("Goodbye,world!\n");
}

/* 程式的入口函式 */
int main(int argc, char *argv[])
{
	void (*fun_ptr)(void);	/* 定義一個指標變數 */
	int code;	

print_usage:
	printf("Input a code <0|1>: ");
	scanf("%d", &code);

	switch(code)
	{
		case 0 : /* 輸出Hello,world! */
			fun_ptr = print_hello;
			break;
		case 1 : /* 輸出Goodbye,world! */
			fun_ptr = print_goodbye;
			break;
		default :	/* 列印用法,重新進行輸出選擇 */
			goto print_usage;
			break;
	}

	fun_ptr();	/* 輸出選擇的列印 */

	return 0;
}
執行結果如下:

分析程式碼可知,根據使用者輸入決定給函式指標賦予相應的函式地址,從而決定呼叫相應的函式。可以想象在專案開發過程當中,可能同一型別的函式有多個,此時呼叫那個需要根據具體的情況來做出選擇,這時候就發揮出了函式指標的作用。

2、第二個小例子

定義一個學生的結構體,要求在結構體內部定義一個函式指標,通過呼叫這個函式指標來打印出學生的資訊。具體程式碼如下:

#include <stdio.h>

/* 定義一個標識學生資訊的結構體 */
struct student {
	int age;		// 年齡欄位
	char *name;		// 名字欄位
	char *addr;		// 地址欄位
	void (*show)(struct student *);	// 定義一個函式指標變數
};

/* 定義一個列印學生資訊的函式 */
void show_student_info(struct student *obj)
{
	printf("student information :\n");
	printf("\tage  : %d\n", obj->age);
	printf("\tname : %s\n", obj->name);
	printf("\taddr : %s\n", obj->addr);
}

/* 程式的入口函式 */
int main(int argc, char *argv[])
{
	struct student A;	// 定義一個表示學生的結構體變數A

	/* 對A進行賦值 */
	A.age = 20;
	A.name = "zhangsan";
	A.addr = "Beijing";
	A.show = show_student_info;

	/* 列印學生A的資訊 */
	A.show(&A);
	
	return 0;
}
編譯並執行,結果如下:

像上面這樣的寫法是很常見的,也是C語言做專案開發中基本都會用到的形式,有點兒面向物件程式設計的意思。

關於函式指標的用法在C語言當中是非常重要的,而且使用的形式是多種多樣的,作用也是不盡相同的,本文只是簡單的說一說而已。不足掛齒,呵呵。