1. 程式人生 > >C語言指標回顧——函式指標和指標函式

C語言指標回顧——函式指標和指標函式

函式指標

函式指標和指標函式兩個詞很像,但實際上只要看後兩個詞就行,函式指標是一個指標,指標是用來存放變數地址的,函式指標存放的地址是函式的入口地址。那麼函式指標如何使用呢,請看下面的程式碼:

#include <iostream>
using namespace  std;
typedef double(*P)(double x);//將特定原型的函式指標型別typedef為P
double square(double x)
{
	return x*x;
}
double cube(double x)
{
	return x*x*x;
}
double calculus(double x1, double x2,P p)
{
	double dx = 0.00000001;//積分步長
	double sum = 0.0;//積分累計值
	for (double x = x1; x <= x2-dx;x+=dx)
	{
		if (p(x)*p(x+dx)<0)
		{
			continue;
		}
		sum += dx*(p(x) + p(x + dx))*0.5;
	}
	return sum;
}
void main()
{
	cout << calculus(0, 6, square) << endl;
	cout << calculus(0,2, cube) << endl;
	system("pause");
}

上面的程式碼中squre函式返回一個浮點數的平方,cube返回一個浮點數的立方,calculus用於計算一個函式的微積分,為了保證可以對一定區間的不同函式進行微積分計算,使用到了函式指標,所以main函式裡第一次呼叫calculus函式時計算的是y=x^2在[0,6]區間的積分,第二次呼叫計算的是y=x^3在[0,2]區間的積分。順便提一下函式指標還有另一種叫法叫回撥函式

指標函式

指標函式看後兩個字,函式。其實指標函式也沒啥特別的,只是它是一個返回值為指標型別的函式。不過返回值是指標的話有些地方要注意一下,不能把函式內宣告的棧記憶體的地址返回。

錯誤示例:

#include <iostream>
using namespace std;
char* GetString()
{
	char str[100];
	strcpy(str, "abcdefg");
	return str;
}
void main()
{
	char* str = GetString();
	cout << str << endl;
	system("pause");
}

輸出結果:

為什麼會輸出一堆“燙”呢,c語言中未初始化的記憶體會用0xcc填充,而0xcccc正好代表“燙”字,所以會輸出一堆燙。因為函式中的陣列用的是棧記憶體,在函式呼叫結束後會釋放,所以返回棧記憶體的地址是沒有用的,下面貼出正確的程式碼:

#include <iostream>
using namespace std;
char* GetString()
{
	char *str = (char*)malloc(sizeof(char) * 100);
	strcpy(str, "abcdefg");
	return str;
}
void main()
{
	char* str = GetString();
	cout << str << endl;
	delete str;
	system("pause");
}

上面的程式碼在函式內動態分配了一塊記憶體並將記憶體起始地址存入指標str中,當函式呼叫完後,堆記憶體不會被釋放,因此能輸出想要的結果,不過要記得手動釋放申請的堆記憶體。

關於函式指標和指標函式的東西就總結這麼多了,如果有錯誤還望指出感激不盡!