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:特定のタイプの関数を指すポインタを宣言する場合は、まずそのタイプの関数を宣言する必要があります.関数名は、関数のアドレスを表すために使用できます.(配列名と結合し,配列のポインタおよびヘッダアドレスの理解原理は同じである)
①関数ポインタがあれば、適切なタイプの関数のアドレスを割り当てることができます.次のサンプルコードを参照してください.
②用法1:関数ポインタを別の関数のパラメータとして使用する.関数ポインタを全体として見て、Aで代用すると仮定します.int f(A);//関数の戻り値がint型であることを宣言する値エントリパラメータは「」関数ポインタ型のパラメータであり、複雑な点を見てみましょう.
3、インスタンスプログラム(C Primer Plusより)
①関数ポインタ:主語はポインタ、すなわち関数を指すポインタです.(整数ポインタ、文字ポインタなどの概念を参照して理解できる)②関数ポインタは実際には関数コードのメモリ内の開始アドレスである.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);
}