C++ ポインター関数と関数ポインター

void 型の関数を除いて、関数は呼び出し終了後に戻り値を持たなければなりません。また、ポインターが関数の戻り値になることもあります。関数の戻り値がポインタ型の場合、その関数はポインタ関数です。ポインター関数を使用する主な目的は、関数の最後に、呼び出された関数から呼び出した関数に大量のデータを返すことです。通常、非ポインター関数呼び出しが終了した後は、1 つの変数またはオブジェクトのみを返すことができます。

1. ポインタ機能

void 型の関数を除いて、関数は呼び出し終了後に戻り値を持たなければなりません。また、ポインターが関数の戻り値になることもあります。関数の戻り値がポインタ型の場合、その関数はポインタ関数です。ポインター関数を使用する主な目的は、関数の最後に、呼び出された関数から呼び出した関数に大量のデータを返すことです。通常、非ポインター関数呼び出しが終了した後は、1 つの変数またはオブジェクトのみを返すことができます。

ポインター関数の一般的な定義形式は次のとおりです。

数据类型 *函数名(参数表)
{
    
    
	函数体
}

データ型は関数によって返されるポインタの種類を示し、関数名と「*」はポインタ関数を識別します。パラメータ テーブルは関数の正式なパラメータ リストです。

【例】

int* fun(int size)
{
    
    
	int* arr = (int*)malloc(size*sizeof(int));
	return arr;
}

int main()
{
    
    

	int* p = fun(5);
	if (*p != NULL)
	{
    
    
		for (int i = 0; i < 5; i++)
		{
    
    
			p[i] = i + 1;
			cout << p[i] <<"  ";
		}
		cout << endl;
	}
	free(p);

	return 0;
}

操作結果:

ここに画像の説明を挿入

2. 関数ポインタ

プログラムの実行中、データがメモリ空間を占有するだけでなく、プログラムを実行するコードもメモリ空間に転送され、一定量の空間を占有します。**各関数には関数名があり、この関数名はメモリ上の関数コードの開始アドレスを表します。** この観点から見ると、通常の関数呼び出し形式「関数名(パラメータテーブル)」の本質は「関数コード(パラメータテーブル)の先頭アドレス」となります。

関数ポインタは、関数コードの先頭アドレスを格納するために特別に使用される変数です。プログラムでは、関数名と同様に、関数へのポインタを使用して関数を呼び出すことができます。つまり、関数ポインターが関数を指すと、関数名と同じ効果になります。関数名には関数コードの開始アドレスだけでなく、関数の戻り値の型やパラメータの数、型、並び順などの情報も含まれます。したがって、関数名で関数が呼び出された場合、コンパイルシステムは実際の参加仮パラメータが一致しているかどうかを自動的にチェックでき、関数の戻り値を使用して他の操作に参加する場合には、型の整合性を自動的に実行できます。チェック。

(1) 関数ポインタの宣言

関数ポインターを宣言するときは、関数の戻り値と仮パラメーター リストも指定する必要があります。一般的な構文は次のとおりです。

数据类型 (*函数指针名)(形参表)

データ型は、関数ポインタが指す関数の戻り値の型を示します。最初の括弧内の内容は、関数ポインタの名前を示します。仮パラメータ テーブルは、関数ポインタが指す関数の仮パラメータの型と数をリストします。ポインター。

[注意] 関数ポインタの定義は複雑な形式であるため、プログラム内に複数の関数ポインタの定義が存在する場合、何度も定義を繰り返すのは非常に面倒なので、 typedefを使用するのが良いでしょう

例えば:

typedef int(*fun)(double);

これは、 fun を「double の 1 つのパラメータと int の戻り値を持つ関数へのポインタ」型のエイリアスとして宣言します。以下では、この型の変数を宣言する必要がある場合、それを直接使用できます。

fun funprt;

これは、その型の funptr という名前の関数ポインタを宣言します。複雑な型は、typedef を使用して簡単にエイリアス化できます。

(2) 関数ポインタの使用
関数ポインタは使用前に割り当てる必要があり、ポインタは既存の関数コードの開始アドレスを指します。一般的な構文は次のとおりです。

函数指针名=函数名;

等号の右側の関数名は、宣言されており、関数ポインタと同じ戻り値の型と同じ仮パラメータ リストを持つ関数を示す必要があります。代入後、ポインタが指す関数を関数ポインタ名を通じて直接参照できるようになります。

【例】関数ポインタインスタンス

void A(float)
{
    
    
	cout << "这是一个A函数" << endl;
}

void B(float b)
{
    
    
	cout << "b的值为:" << b << endl;
}

void C(float c)
{
    
    
	cout << "c的值为:" << c << endl;
}

const float PI = 3.14159f;
const float TOW_PI = PI * 2.0f;

int main()
{
    
    
	void (*fun)(float);//函数指针
	A(PI);
	fun = A;//函数指针指向A
	fun(PI);//函数指针调用

	fun = B;//函数指针指向B
	fun(TOW_PI);//函数在指针调用
	fun(13.0);//函数指针调用

	fun = C;//函数指针指向C
	C(PI);//函数指针调用
	return 0;
}

操作結果:

ここに画像の説明を挿入

上記のプログラム例では、 void 型の関数ポインタが宣言されています。

void (*fun)(float);//void类型的函数指针

main 関数の実行中に、代入ステートメントを通じてポインターが関数 A、B、および C をそれぞれ指すようにし、関数ポインターを通じて関数が呼び出されます。

おすすめ

転載: blog.csdn.net/NuYoaH502329/article/details/132105533