構造と機能のポインタ

ポインタ変数の構造の定義

次のように構造体変数の一般的な形式が定義される:
フォーム1:第1の構造体のタイプを定義し、その変数を定義
構造体の構造識別子
{
  変数リストのメンバーを; ...
;}
名*構造体構造識別子ポインタ変数、製品の
変数が初期化される:構造体の構造を識別子変数名=初期値1、初期値2、...、N-初期値};

形態2:一方、変数定義型の定義
構造体構造識別子
{
  メンバ変数のリスト; ...
} *ポインタ変数名;

形態3 :一度だけ定義未知の構造変数に直接変数を定義する指示
構造体
{
  メンバ変数リスト; ...
} *ポインタ変数名;

「ポインタ変数名は、」構造体ポインタ変数の名前であることを特徴とします。図1は、構造体の最初のフォーム定義、ポインタ変数のこの種の構造のこの定義であるタイプ2及びタイプ3は、同時に構造の定義で、このポインタ変数の構造の定義です。

定義された関数ポインタ
一般的な関数ポインタはそう定義することができる。
  INT(FUNCの*)(INT、INT);
2つのint型のパラメータを含むポインタを示し、戻り値は関数ポインタintで任意の形式の関数がある場合。
ADD2整数(INT X、YのINT)
{
  X + Yを返す;
}
これは実際のポインタFUNCで達成することができます。
FUNC =&ADD2; //ポインタの割り当て、またはFUNC = ADD2; ADD2&と同義ADD2
のprintf( "FUNC(3,4)= %Dを\ n"、FUNC(3,4));

実際には、移植のためのコードtypedefで定義された関数ポインタ型を使用して一般的に、考える
typedefのint型(* FUN)(int型、int型); //下記参照

/ * typedefのINT(* funcptr) ();これは、:intは、戻り値、パラメータなしで関数ポインタを定義し、
それがfuncptrポインタは、INT(*)()型である
funcptrテーブル[10]; 
定義しますアレイは、アレイはfuncptrタイプです。このアレイ内のコンテンツが戻り値intを指すポインタであり、引数* /とらない
。FUN&FUNC = ADD2
)(FUNCします。

構造は、関数ポインタが含まれている
実際の構造では、それは関数ポインタ変数を含むような一般的な可変であってもよい。ここでは単純な実装です。

コードをコピー
コードをコピー
する#include <stdio.hの> 
構造体DEMO   
{   
    int型のX、Y、   
    INT(FUNCの*)(INT、INT); //関数ポインタ   
};   
  
int型ADD1(INT X、YのINT)   
{   
    X * Yを返す;   
}   

int型ADD2 (INTのX、YのINT)   
{   
    ; X + Yを返す   
}   

)(ボイド主   
{   
    DEMOデモ構造体;   
    demo.func = ADD2; //構造関数ポインタ割り当て   
    //demo.func=&add2; //関数ポインタ構造割り当て   
    のprintf( "FUNC(3,4)D =%\ N-"、demo.func(3,4-));   
    demo.func = ADD1;   
    のprintf( "FUNC(3,4)D =%\ N-"、デモ; .FUNC(3,4))   
} 
:端末表示を行った後
FUNC(3,4)= 7。
FUNC(3,4)= 12であります
コードをコピー
コードをコピー

関数に構造体のポインタ

C言語の構造体には、C言語で構造体クラスの概念に最も近いですが、唯一のメンバーが機能を持つことはできませんが、また機能の私達の使用を促進機能へのポインタがあるかもしれません。たとえば、次のよう:

コードをコピー
コードをコピー
する#include <stdio.hに>   
する#include <STDLIB.H>   
の#include <string.hの>   
      
のtypedef構造体学生   
{   
    int型のID。  
    文字名[50]。   
    無効(*初期)();  
    無効(*プロセス)(int型のID、のchar *名);  
    無効(*破壊)();  
} STU。  
      
無効初期()   
{   
    のprintf( "初期設定... \ nを");  
}   
      
ボイドプロセス(int型ID、チャー*名)   
{   
    のprintf( "プロセス... \ N%D \ T%S \ n"は、ID、名前)。  
}   
     
ボイドは()を破壊   
{   
    のprintf( "破壊... \ nを")。  
}   
      
int型のmain()   
{   
    STU * STU1。  
    STU1 =(STU *)はmalloc(  はsizeof(STU)); 
    //使用は、最初に初期化しなければならない   
    stu1-を>上記= 1000 IDを述べ、   
    strcpyの(stu1->名、 "C ++");   
    stu1-> =初期初期;   
    STU1 - > =プロセス工程;   
    stu1->破壊する破壊=;   
    のprintf( "%D \ T%S \ N-"、stu1-> ID、stu1->名);   
    stu1->初期();   
    stu1->プロセス(STU1 - > ID、stu1->名);   
    stu1->破壊();   
    無料(STU1);   
    0を返す;   
} 
端末ディスプレイ:
1000年C ++
の初期化...
プロセス...
1000年C ++
破壊します..
コードをコピー
コードをコピー

C言語は、どのような構造の関数機能を実現するには?構造と彼の内部属性は、方法があること、に、同様のタイプからなる
ような構造は、一般的にプロトコル・タイプと呼ばれ、参照: 
構造体{ 
  int型FUNCID; 
  CHAR * funcnameに、 
  INT(* funcint)(); / int型の関数ポインタ* / 
  無効(* funcvoid)(); / *関数ポインタの型がvoid * / 
}; 
常に初期化する必要が、面倒

コードをコピー
コードをコピー
する#include <stdio.hに>   
      
のtypedef構造体   
{   
    INT A、   
    ボイド(pshow *)(INT);   
} TMP;   
      
ボイドFUNC(TMP * TMP)   
{   
    IF(tmp-> A> 10)//> 10の場合、コールバック関数。  
    {   
        (Tmp-> pshow)(tmp-> A);   
    }   
}   
      
ボイド表示(INT A)   
{   
    のprintf( "のD値は%\ N-である"、A);   
}   
      
ボイドメイン()   
{ 
    TMPテスト、   
    テスト。 11 =;   
    test.pshow =表示、   
    FUNC(テスト&);   
}   
端末ディスプレイ:
の値が11 / *コールバック関数は、一般的な使用である: (メンバーコールバック関数のポインタを含む)当事者定義構造 B構造体変数の定義とパーティーを登録し、 A N登録リスト構造の収集B側は、特定の時間にコールバックをリストを横断する、形成されています。 、関数に渡される関数のパラメータとして関数ポインタが呼び出されると、 呼び出された関数がコールバックを形成し、このポインタによる外部関数呼び出し可能<pは>一般的な手順コールバック関数は非常に明らかな効果がないかもしれませんではありませんこのフォームを使用して</ P> <P>主
な目的は、動的ライブラリ、外部パラメータによってのみコールバック関数のポインタの形で別のプログラムを呼び出す関数として、同じでないファイルとして機能します着信音の機能アドレスが達成され
ます。</ p> <p>コードは、機能を変更されていると、コードベースを変更する必要はありません、あなたは通常、メンテナンスの容易さを実現してアップグレードすることができますプログラムは、</ P> * /呼び出す
:ソースHTTPS: //www.cnblogs.com/lvjunjie/p/8961731.html

おすすめ

転載: www.cnblogs.com/llanse-xianchengduo/p/10961936.html