C言語独学ノート--C関数とポインタ


非チュートリアル
  • 1、関数ポインタとは何ですか.
  • 2、関数ポインタ
  • を使用
  • 3、インスタンスプログラム(C Primer Plusから)
  • 1、関数ポインタとは何ですか.
    ①関数ポインタ:主語はポインタ、すなわち関数を指すポインタです.(整数ポインタ、文字ポインタなどの概念を参照して理解できる)②関数ポインタは実際には関数コードのメモリ内の開始アドレスである.3例:int(*sub)(num 1,num 2);a,int宣言関数の戻り値は整数bであり、(*sub)2つのオブジェクトを結合することによって、コンパイラにポインタタイプのオブジェクトcであることを通知し、(num 1,num 2)パラメータは、このオブジェクトが関数dであることを示し、この定義はsub(num 1,num 2)を指すポインタであり、関数sub(num 1,num 2のポインタとも呼ばれる)
    2、関数ポインタの使用
    PS:特定のタイプの関数を指すポインタを宣言する場合は、まずそのタイプの関数を宣言する必要があります.関数名は、関数のアドレスを表すために使用できます.(配列名と結合し,配列のポインタおよびヘッダアドレスの理解原理は同じである)
    ①関数ポインタがあれば、適切なタイプの関数のアドレスを割り当てることができます.次のサンプルコードを参照してください.
       void f1(char*);//                       
    	void f2(char*);
    	int round (double);//                      
    	void (*pf)(char*);//                        char         
    	pf=f1;//                  f1(char*)                                     (==     /      /      ==)  。
    	pf=f2;//  
    	pf=round;//   round(double)                  double    pf        ==    ==。
    	pf=f1();//  f1()       ,         (      )。
    

    ②用法1:関数ポインタを別の関数のパラメータとして使用する.関数ポインタを全体として見て、Aで代用すると仮定します.int f(A);//関数の戻り値がint型であることを宣言する値エントリパラメータは「」関数ポインタ型のパラメータであり、複雑な点を見てみましょう.
    void show(void(*fp)(char*),char*);
    //           :void show()              
    //(xxx,xxx)                 
    //     void (*fp)(char*)        (               )
    //     char*         
    //                           。
    //                        。(                   )
    

    3、インスタンスプログラム(C Primer Plusより)
    /*func_ptr.c--      */
    # include 
    # include 
    # include 
    
     char showmenu(void);
     void eatline(void);//
     void ToUpper(char* str);
     void ToLower(char* str);
     void Transpose(char* str);
     void Dummy(char* str);
     void show(void (*fp)(char*),char *str);
     
     int main(void)
     {
     	char line[81]={0};
     	char copy[81]={0};
     	char choice=0;
     	void (*ptfn)(char*);//                
    	                   //                     char      
    					   //   pfun    (   *pfun)        pfun        (   ) 
    	puts("enter a string empty line to quit:");
    	while(gets(line)!=NULL&&line[0]!='\0')
    		{
    			while((choice=showmenu())!='n')
    				{
    					switch (choice)//                 
    						{
    							case 'u': ptfn=ToUpper;   break;
    							case 'l': ptfn=ToLower;   break;
    							case 't': ptfn=Transpose; break;
    							case 'o': ptfn=Dummy;	  break;
    							defulat :                 break;//     	  					
    						}
    					strcpy(copy,line);
    					show(ptfn,copy); 
    						
    				}
    			puts("enter a string empty line to quit:");
    		} 
     	puts("bye");
     	return 0;
     }
    /*===================================== 
      :               
        : 
       :        
    ========================================*/
    char showmenu(void)
    {
    	char ans;
    	puts("       :");
    	puts("u->up,l->low");
    	puts("t->tra,o->ori");
    	puts("n->next");
    	ans=getchar();
    	ans=tolower(ans);
    	eatline();
    	while(strchr("ultin",ans)==NULL)
    		{
    			puts("         "); 
    		    ans=getchar();
    			ans=tolower(ans);
    			eatline();	
    		}
    	return ans;
    	
    } 
    
    void eatline(void)
    {
    	while(getchar()!='
    ') { continue; } } /* */ void ToUpper(char* str) { while(*str) { *str=toupper(*str); str++; } } /* */ void ToLower(char* str) { while(*str) { *str=tolower(*str); str++; } } /* */ void Transpose(char* str) { while(*str) { if(islower(*str)) { *str=toupper(*str); } else if(isupper(*str)) { *str=tolower(*str); } str++; } } /* */ void Dummy(char* str) { printf("
    "); } /* ================================= :1,void (*fp)(char*) 2,char *str : =========================================*/ void show(void (*fp)(char*),char *str) { (*fp)(str);// 1 2 puts(str); }