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

図1に示すように、関数ポインタと

A.まず、簡単なルックと関数ポインタ

簡単に言えば、この関数は関数名+ +(パラメータ)ならびに特定のコードの構成の戻り値の型である単一の機能ブロック、(!我々はすべてを知っていると信じて)を完了することです。そして、ポインタ(ポインタ変数)はストレージです変数のアドレス(メモリセルの数)、従って各ポインタによってコンテンツが対処することができます。

図2に示すように、関数ポインタ

ポインタの機能は、本質的に、最終的に機能を呼び出す関数へのアドレスまたはアドレス式が返されるポインタ型の関数である戻り値の型を指します。その本質は、まだ機能です!

どの関数のプロトタイプは次のとおりです。タイプ*関数名(仮パラメータ)

そのようなそのアドレス二つの値とリターンの最大値選択として
ここに画像を挿入説明
出力されました:

000000000065FE48

000000000065FE48

この2つの場所が同じであるのはなぜ?読者が考えるように。

二つのことについてのトーク:

1.ポインタ型は、関数の戻り値の上記タイプのmax int型であるように、関数の戻り値などの型を返す必要があり種類、それがリターンint型が続かなければならないタイプ

2.リターンポインタアドレスは、すなわち有効である必要があり、ポインタ機能は、次のような、関数内のローカル変数へのポインタを返すことはできません。

INT * F(){I 7 = INT;リターン&I;}

それは私がローカル変数であるため、完了時に実行関数f、そのライフサイクルは、関数fの終わりで終了となり、合法的な、私はメモリを占有しないが、それは何のアドレスaを持っていないことを、解放されます。(メモリの内容について、読者は、公開このテキストの数の4つのメモリ領域と呼ばれる)が、このような静的な変数のアドレスのようなグローバル変数として正規アドレス、に戻ることができます。

関数へのポインタアクション:

コードはより簡潔かつある程度のメモリ保存することができ、あなたは要素の配列を返す必要があるとき、あなたは、単に、呼び出す関数に最初の要素のアドレスを返す配列を操作する関数を呼び出すような(私は複数を返却します値)。

それとも別の関数にメモリアドレスを返す動的に割り当てられたメモリのmalloc関数は、他の機能は、メモリの動作をすることができません。もちろん、他の効果、実際には読者自身の経験があります。

図3に示すように、関数ポインタ

まず、いくつかの概念整理をお手伝いします

1.関数のアドレス

機能は、アプリケーションは、そのためのコンパイラ処理機能の目的は、コードのセクションの後にコンパイルされている、システムのコードはすぐにいくつかのストレージ容量、ストレージ容量と、このエントリの最初のアドレスを割り当てる関数のアドレスであるか、我々が言うこと関数ポインタ。(ファンクションは、コード領域に格納される)、したがって、対応する関数への関数ポインタです。

この関数は、それが彼の関数名またはアドレスエントリ関数ポインタで、定義されています。?名前の後に呼び出される関数への私たちの呼び出しに加えて、関数ポインタとのコンセプトなので、別の方法はありません
ここに画像を挿入説明
結果は:

単なるテスト!単なるテスト!単なるテスト!

4014F0 4014F0 4014F0

缶&F関数名やその他の動作は同じアドレスと最終的に出力されるのはなぜ?

関数名が式に表示されたときに、コンパイラが自動的に関数へのポインタ、ポインタに変換されるためです。(それ自体を指すポインタである俗または関数名)したがって、F、&関数のエントリアドレスにF *&Fと対応します。

機能が確定した場合、それは対応するアドレスは、関数名は、あなたが関数へのポインタに割り当てることができ、一定のアドレスであると判断されたことを意味メモリ空間を、落ち着くでしょう。

2.関数ポインタ

関数名が直接メモリ内のアドレスを機能コードを表し、それは関数で使用されるポインタ変数のアドレスを取得することが可能であり、関数の変数のポインタは、関数ポインタと呼びます。

表現は、関数ポインタを記述する前に、最初は、関数の種類を理解します。

関数型は、インターフェースの関数であり、関数の戻り型の型およびパラメータ、です。

int型TEST1(int型*、ダブル)、およびint型TEST2(int型*、ダブル)は、関数のと同じタイプで、TEST1とTEST2とフロートTEST3(int型、int型)は、関数のと同じタイプではありません。TEST1とTEST2インタフェースint型(int型*、ダブル)

我々は、機能の抽象1型に表現するキーワードのtypedefを使用することができます。

typedefの戻り値の型関数型名(パラメータ型フォーム)

関数の名前を入力すると、ユーザーによって定義されたカスタム識別子です。

typedef int型F(ダブルint型*)はint型(int型*、double)の抽象化のこのタイプの関数です。

即ち、fは整数(INT *、二重)関数のこのタイプを表します。

それはTEST1、TEST2 fを使用することができ、TEST1とTEST2プロトタイプ宣言を行います。

次は関数ポインタの表現をご紹介します:

戻り値(*ポインタ変数名)(仮パラメータ型)

関数ポインタ変数は、機能の特定のクラスへのポインタであるため、そのように表すことができます。

関数ポインタ型の名前を入力します*

だから、より多くの同じ関数ポインタ型のため、だから何我々簡潔な方法手段は何?ありませんか

我々はまだtypedefを持つポインタ型を定義する必要があります。

typedef int型(* P)(int型、int型)

さて、以下のコードを見
ここに画像を挿入説明
出力はすべて2 00000000004015C5です

ご注意ください

(* p)の括弧内の関数ポインタはint(* P)(int型、int型)を除去することができない、またはそうでなければなり

int型* P(int型、int型)関数ポインタ。

4、アプリケーションの関数ポインタ

我々は2つの長いリスト、それが何であるかを使用最後に関数ポインタは?一般的に言えば、そこにいることをされていると言います

1.ファンクションコール関数ポインタ

2の形態と同様のパラメータのポインタ関数として一般的な関数ポインタ

それの例は千の言葉のように良いようではありません。

例:キーボード、これら二つの出力オペランドの結果から、二つの数値と演算記号の入力
ここに画像を挿入説明
出力:

+ - あなたの操作(入力+または)を選択してください

2つのオペランドを入力してください

3

4

操作は次のとおりです。+ 4.000000 3.000000 = 7.000000

階層システムの抽象化とデザイン効果のように、当然のことながら、より高度な関数ポインタアクション。

公開された261元の記事 ウォンの賞賛4 ビュー4258

おすすめ

転載: blog.csdn.net/it_xiangqiang/article/details/105206448