Ì
o^ t ¾ Ó á Ô ÐÕ ªA b ç ¸à Ô
<
ÊÃ º í ' (Function Pointer)
y
©
@ /l
∗2007¸ 10 Z 4 10{ 9
V
1 â Ç a + ' ×ß
<
Êú í'\¦ <Êú\¦ ovH í's.
<
Êú í'\¦ &ñ_ H ~½ÓZOÉr {9ìÍ øí'\¦ &ñ_ H ~½Ódõ q5pw .
\
V\¦ [þt xH &ñúH 6£§õ °ú s &ñ_ôÇ.
int x;
&
ñ
ú\¦ ovH í' pxr É6£§õ °ú s &ñ_ôÇ.
int *px;
s
2£§ ·ú¡\ *ëß ·¡%63£§`¦ ·ú ú e.
<
ÊúH #QbG> |¨c? Õª| Ð <Êú_ "é¶+þA(prototype)s. 7£¤ <Êú
í'\¦ H ~½ÓZOÉr H:r&hܼР<Êú_ "é¶+þA(prototype)`¦ H ~½Ó Z
O
õ 1lx{9 . ë, ß <Êú_ "é¶+þA\"f <Êú s2£§ ÂÒìr ·ú¡\ *\¦ ·¡s )a.
\
V\¦ [þt 6£§s &ñú\¦ ìøÍ¨8 H <Êú_ "é¶+A þ{9 âĺ, int f(); // ³ÉíªÁ
Õ
ª <Êú_ í'H 6£§õ °ú s bC#a TÒ» ¿ l. ÕªX<, ÕªXOt ·ú§
.
int *pf(); // ÍòªÁ¬Ç ²¼¬Ýᱸ¦Ûå ¨Éá³Òá³´£Ûá ³ÉíªÁ
$
כ Ér <Êú í' m &ñú_ í'\¦ ìøÍ¨8 H <Êú s. s X
O
> )a sÄ»H í'\¦ 0AôÇ ?/6 x Ãи íß ‘*’ ÊÃ<º ñئ`¦ 0AôÇ ‘()’
íßÐ íß Äº íH0A ±úl M:ëHs. KÕþÉr 6£§õ °ú s Fc ñ Óü l
íß ‘()’Ð í' íßü< ú"î`¦ ÑütQ"f í' íßs $
÷&¸2¤ H כ s.
∗#l\ ¸H ?/6 xr "Éîr&hܼРÉr X<"f 4RM®o¦ /åLôÇ ÂÒìr`¦ ]jü@ôÇ ¸H ?/6 x\
@
/ôÇ ¸H ݶoH &Üh¼Ð y©@/l\> e_þvm.
int (*pf)(); // ÍòªÁ¦Ûå ¨Éá³Òá³´£Ûá ³ÉíªÁ¬Ç ²¼¬Ýᱸ
s
QôÇ ~½ÓdÉr qÄ» u 2+3*4H d\"f 3*4 $ >íß÷&#Q 12 ÷&¦ Õª 6£§\ 2 8K4R 14 ÷&H כ õ q5pw . íß Äº íH0A\
"
f * +Ð Z}l M:ëHs. "f 2+3s $ >íß÷&> 9 (2+3)*4
H dܼРFc ñÐ Ó#üQ1> H כ s.
6£§Ér <Êúü< Õª <Êú\ @/ôÇ <Êú í'_ &ñ__ \Vs.
• double func(); −→ double (*pfunc)();
• float func(int, long); −→ float (*pfunc)(int, long);
• double *func(int, long); −→ double *(*pfunc)(int, long);
• int *func(char *); −→ int *(*pfunc)(char *);
V
2 â ¡ õ · ' ×ß
<
Êú í'H H:r&hܼР6£§õ °ú s ñئôÇ.
(*fp)(); // ÍòªÁ¦Ûå ¨Éá³Òá³´£Ûá ³ÉíªÁ¬Ç ²¼¬Ýᱸ¦Ûå ¬È¬Õò³µª¸ ¡Æ ³ÉíªÁ¦Ûå ³¼כÖå
<
Êú í'H ÊÃ<º_ í'sټРÊÃ<º_ ÅÒè°úכ`¦ @/{9K ôÇ. sXO
>
<Êú í'\¦ ílo½+É M:H H:r&hܼР6£§õ °ú s ôÇ.
int func() {
return 0;
}
int main() {
int (*fp1)() = &func;
(*fp1)(); // ³ÉíªÁ ²¼¬Ýᱸ¦¼ ³ÉíªÁ ³¼כÖå // ¥¼£Ûá
int (*fp2)();
fp2 = &func;
(*fp2)(); // ³ÉíªÁ ²¼¬Ýᱸ¦¼ ³ÉíªÁ ³¼כÖå }
s
\ @/ôÇ çßéßôÇ \V\¦ [þt#QÐ. s°úכ 3.14\ <Êú JQp'(²ú)
Ð ~ÃÎÉr &ñú\¦ YLK"f ìøÍ¨8 H <Êú_ í'\¦ 6 x H \Vs.
#include <iostream>
using namespace std;
double piX(int);
int main() {
double (*pp)(int) = NULL;
pp = &piX; // pp = piX; ¬½ ¤Ñò¬Ýå int x = 2;
cout << "The result with " << x << " is " << (*pp)(2) << ".\n";
return 0;
}
double piX(int x) {
cout << "We multiply pi with " << x << ".\n";
return 3.14*(double)x;
}
<
Êú í'Ð pp\¦ Ùþ¡¦ NULLÐ {9éß íloÙþ¡. ¢¸ôÇ pp = &piX;Ð piX <Êú_ ÅÒèÐ @/{9Ùþ¡. ÕªX<, ÊÃ<º_ ÅÒè @/ 6§õ£ °ú s <Êú ^
Ð @/{9K¸ )a. s\ @/ôÇ H_7H §F_ 412 Aá¤_ NOTE\ :r.
pp = piX; // pp = &piX; ¬½ ¤Ñò¬Ýå³´¤´.
s
\¦ 8 sK l 0AK 6£§_ áÔÐÕªÏþ`¦ и2¤ .
#include <iostream>
using namespace std;
int add(int a, int b) {
return a+b;
}
int main() {
cout << "add(1,2) = " << add(1,2) << endl;
int (*fp)(int,int);
fp= &add; // fp = add ¬½ ¤Ñò¬Ýå
cout << "(*fp)(2,3) = " << (*fp)(2,3) << endl; // fp(2,3) ¡½ ¤Ñò¬Ýå cout << "fp = "<< fp << endl;
cout << "(&fp) = "<< (&fp) << endl;
cout << "(*fp) = " << (*fp) << endl;
cout << "add = " << add << endl;
cout << "(&add) = " << (&add) << endl;
cout << "(*add) = " << (*add) << endl;
} s
áÔÐÕªÏþ`¦ z´' 6£§õ °ú Ér õ\¦ ·p.
add(1,2) = 3 (*fp)(2,3) = 5 fp = 004110CD (&fp) = 0012FF40 (*fp) = 004110CD add = 004110CD (&add) = 004110CD (*add) = 004110CD
Ð1pws, éßíHy <Êú add\ @/K"fH &add *add °ú Ér õ(004110CD)
\
¦ ÍÇr`¦ ·ú ú e. "f fp = addü< fp = &addH 1lx{9 .
Õ
ªX< z´' õ\¦ Ð, fp ü< (*fp)_ °כú¸ 1lx{9<Ê`¦ ·ú ú e. "f, 0
A_ âĺ, fp(2,3) õ (*fp)(2,3)¸ °ú Ér õ\¦ ?/H כ s.
#
Q" כ `¦ jþttH y_ ¼#_\ ÷&x. 9_ âĺ, fp = &add ü
< (*fp)(2,3) °ú Ér 7á§ 8 %3ôÇ ~½Ód`¦ ñôÇ.
V
3 â £ U d
<
Êú í'\ @/ôÇ Ér \VÐ, §F_ \V\"f 4R:r 6£§ \V\¦ и2¤ .
#include <iostream>
using namespace std;
double p1(int);
double p2(int);
// ¤Á ¨Í᮵ Íá¤Éå¬Ýá´£Ûá int³Ïò¬Ûå Íá¤Éå¬Ýá´¦¼ כij´£Ûá // double³Ïò ³ÉíªÁ¦Ûå Ȫȳ´£Ûá ²¼¬Ýᱸ¬È¤´
void estimate(int, double (*)(int));
int main() {
cout << "Enter LOC: ";
int code;
cin >> code;
cout << "Estimated time for P1:\n";
estimate(code, &p1);
cout << "Estimated time for P2:\n";
estimate(code, &p2);
return 0;
}
double p1(int lns) {
return 0.05 * lns;
}
double p2(int lns) {
return 0.03 * lns + 0.0004 * lns * lns;
}
void estimate(int lines, double (*pf)(int)) {
cout << "For " << lines << " lines, "
"it takes " << (*pf)(lines) << " time.\n";
}
#
l"f estimateH &ñú(int)ü< <Êú í'\¦ ~ÃÎH <Êús. estimateH voidÐ Áº כ ¸ ìøÍ¨8 t ·ú§H. estimate ¿º P: Ð ~ÎÃH <Êú í '
H &ñú °úכ`¦ ~ÃÎ"f double`¦ ìøÍ¨8 H <Êú_ í's.
<
Êú í'\¦ <Êú_ ²ú Ð 6 x # 4¤¸úôÇ switchëH`¦ @/ H
\
V\¦ ·úÐx. gË:íß`¦ H áÔÐÕªÏþܼРĺ 6§õ£ °ú Ér áÔÐÕªÏþ
`
¦ и2¤ .
#include <iostream>
using namespace std;
float plus(float a, float b) { return a+b; } float minus(float a, float b) { return a-b; } float multiply(float a, float b) { return a*b; } float divide(float a, float b) { return a/b; } void operate(float a, float b, char opCode) {
float result = 0;
// execute operation switch(opCode) {
case ’+’ : result = plus(a,b); break;
case ’-’ : result = minus(a,b); break;
case ’*’ : result = multiply(a,b); break;
case ’/’ : result = divide(a,b); break;
}
cout << result << endl; // display result
}
int main() {
operate(2, 5, ’+’);
} 0
A_ switch ëHÉr <Êú í'\¦ 6 x 6£§õ °ú s ÷¶.
#include <iostream>
using namespace std;
float plus(float a, float b) { return a+b; } float minus(float a, float b) { return a-b; } float multiply(float a, float b) { return a*b; } float divide(float a, float b) { return a/b; }
void operate(float a, float b, float (*op)(float,float)) {
// ²Ýå´£Ûá (*op)(a,b)¦Ûå ¤¸ ªÍá³¼³´È§Éá
// ¬º¡ÈªÍá op(a,b)¤¼ ¡´£Ûò³Éí¬Ûå ¨¼¬È¡È ¬Ä³µ £Íø¬¸¨Ñí float result = op(a,b);
cout << result << endl; // display result }
int main() {
// ²Ýå´£Ûá &plus ¦Ûå ¤¸ ªÍá³¼³´È§Éá
// ¬º¡ÈªÍá plus ¤¼ ¡´£Ûò³Éí¬Ûå ¨¼¬È¡È ¬Ä³µ £Íø¬¸¨Ñí operate(2, 5, plus);
}
float (*op)(float,float)\¦ K$3K Ð. {9éß opH ú ?/t ©Ãº e
. íß Äº íH0A\ _K (*op) $ ½+Ë÷&Ù¼Ð, s opH H:r&hܼРí
' úe`¦ ·ú ú e. Õª 6§ £<Êú ñئ`¦ ?/H (float, float) ½+Ë
÷
&Ù¼Ð, opH float ü< float ¿º>h_ \¦ tH <Êú_ í' ú כ s
. t}ܼРp ·±ú¡_ float ½+Ë÷&Ù¼Ð, opH float °úכ`¦ ìøÍ¨8 H float ü<
float ¿º>h_ \¦ tH <Êú_ í' ús.
V
4 â ¡ ´O ± ÕB ×l Ð M % K V æ ·
í' ÕªQ 1pw, ÊÃ<º í' í' Ér <Êú í'[þtõ ½+Ë÷& {
©
© Ðl'p ©{©y 4¤¸ú > Ð{ Ã9º e. ëH[tsþ ùß C C++ áÔÐÕªÏþ [
þ
t`¦ Ð 6£§õ ° sú 7á§ 4¤¸úôÇ âĺ¸ z´]j e`¦ ú e. ÕªQ H:r&hܼ
Ð í' <Êú í' ÷&H ~½ÓZO`¦ sK ¦ H H ]XH s
K½+É Ãº eH ?/6 xs.
\
V\¦ [þt#Q <Êú í'_ C\P`¦ H ~½ÓZO`¦ Ð.
double (*pf[3])(double, double) K
$3K Ð, {9éß pfH ú ?/t ©Ãº eH X<, C\`P¦ ?/H []s
í'_ *РĺíH0A Z}ܼټРpf[3]H [j >h_ "é¶è\¦ C\Pe`¦ ·ú Ã
º e. Õª 6£§\H *s ·¡#Q"f *pf[3] ÷&Ù¼Ð, í'_ C\Ps )a. Õª 6
£
§ (double, double)s ·¡#Q"f *pf[3](double, double)Ér double, double\¦ <Êú
Ð tH <Êú í'_ C\Ps. t}ܼР±p ·ú¡_ doubles ·¡#Q,
^
H double`¦ ìøÍ¨8 9 double, double\¦ <Êú Ð tH <Êú í'_ C
\P כ s.
6£§Ér <Êú_ "é¶+þAõ Õª\ ©6£x H <Êú í' s.
1. void operate(float, float, float (*)(float,float)) −→ void (*pOperate)(float, float, float (*)(float,float))
2. int (*func())() −→ int (*(*pFunc)())()
1 \VH ·ú¡\"f H operate <Êú void operate(float a, float b, float (*op)(float,float))_
"
é
¶+þAõ Õª "é¶+þA\"f Ä»AôÇ <Êú í's. ĺoH float (*op)(float,float) float °úכ`¦ ìøÍ¨8 H float ü< float ¿º>h_ \¦ tH <Êú_ í' ú_
sêøÍ כ `¦ ·ú¦ e. pOperateH Áº כ ¸ ìøÍ¨8 t ·ú§Ü¼ 9, float, float Õ
ªo¦ “float °úכ`¦ ìøÍ¨8 H float ü< float ¿º>h_ \¦ tH <Êú_ í '
+þA”`¦ [j >h_ Ð tH <Êú_ í' כ s.
è 4¤¸úK ÐsH 2 \VH &ñú\¦ ìͨø8 H <Êú_ í'\¦ ìøÍ¨8 H
<
Êú func_ "é¶+Aõþ Õª func\ @/ôÇ <Êú í's. s\ @/ôÇ áÔÐÕªÏþ \V
\
¦ и2¤ .
#include <iostream>
using namespace std;
int (*func())(); // function int (*(*pFunc)())(); // pointer int hello()
{
cout << "Hello\n";
return 1;
}
int (*func())() { return &hello; } int main()
{
cout << ((*func)())() << endl;
pFunc=&func;
cout << ((*(*pFunc))())() << endl;
return 0;
}
int (*func())(); \¦ K$3K Ð. {9éß funcH ú ?/t ©Ãº e. í
' çß]X Ãи íß *ü< <Êú ñئ`¦ ?/H () íß ×æ () ĺ íH 0
A 8 ß¼Ù¼Ð, func() $ ½+Ë)a. "f H:r&hܼРfuncH <Êús.
Õ
ª 6£§ *s ½+Ë÷&#Q *func() ÷&Ù¼Ð, funcH ÊÃ<ºH <ÊúX<, ‘í'\¦
¨ 8
H <Êú’ )a. Õª 6£§ (*func())Ð ^ Fc ñÐ ÑütQ#. Õªo¦
"f r <Êú ñئ`¦ ?/H () ·¡#Q"f (*func())() ÷&ټР, funcH <Ê Ã
º_ í'\¦ ìøÍ¨ 8H <ÊúX<, :£¤Zy> ²ú~ÃÎH JQp'()[þtÉr \O.
t}ܼР±p ·ú¡_ int ·¡#Q"f, int (*func())() ^H ÇaÊÁG±ê£· ð5».É § ê>
ÐM á!ÐM ÁþÊÁ+ ïê>'a· ð5».É ÐM ÁþÊÁ )a.
· ú
¡_ כ `¦ sKÙþ¡, int (*(*pFunc)())(); _ âĺH ~1. int (*func())();
\
"f func\¦ (*pFunc)Ð õH כ \ Ô¦õ l M:ëHs. 7£¤ pFuncH í' X
<, ÇaÊÁG±ê£· ð5»É .§ ê>ÐM á!ÐM ÁÊþÁ+ ïê>'a· ð5»É .ÐM ÁþÊÁ+ ïê>'a
כ s.
7 á
§ 8 ÙütôÇ \VÐ ‘p×±¼ÀÓ ÿnmy’_ ‘C <Ê&ñõ z´Ãº’\ ¸H 6£§_ \V\¦
Ð. (‘±p×¼ÀÓ ÿnmy’_ ‘C Ê&<ñõ z´Ãº’H ÃЦ ëH³ 3lq2¤\ eܼ 9 ëH&h C áÔÐÕªA Q ÷&¦ H |ÃÐÉr ìøÍ×¼r {91lqK ½+É Õþ[þt ׿ s.) int main()
{
(*(void(*)())0)();
} 0
Aü< °ú Ér ï×¼ z´]jÐ ({9)aH z´s ZtÖ¦t¸ ¸ØÔxtëß, z´ ]
j Áº \Q \Os ({9)a. Óüt:r z´'`¦ \Q ±ú כ s. 0A_ ï×¼
({9s )aH z´Ér ëHZO&Üh¼Ð ëH]j \OH כ s. õ 0A_ ï×¼
H #Q" _p?
{ 9
éß (*(void(*)())0)();\"f *, (), ; ¢¸H void°ú Ér \V#Q כ Ér 0 ÷r s
. ÕªQټРĺoH 0 Ò' K$3`¦ rK ½+É כ s. ĺ 0H Õª ·ú¡\ (void(*)())s e. sXO> Õüw ·ú¡\ ()s ¸H âĺH 6£§õ °ú Ér sáÔ H Û
¼hA(type casting) 7£¤ +þA y©]j_ âĺs.
int x = (int) 3.2;
7
£
¤ 0s :£¤&ñ +þAܼР¨8÷&H כ s. Õª ¨8÷&H +þAÉr 0 ·ú¡\ eH (void(*)())_ F
c ñ îß_ void(*)() s. void(*)()H Áºכ ¸ ìøÍ¨8 t ·ú§H <Êú_ í' +
þ
Ae`¦ ·ú ú e. "f (void(*)())0 Ér 0`¦ Áºכ ¸ ìøÍ¨8 t ·ú§H <Êú_
í'Ð sáÔ HÛ¼hAôÇ כ s. s âĺ 0s <Êú í' )a כ sÙ¼Ð, 0 t\ [þt#QeH ÅÒèH Õª <Êú_ r t ÷&H כ s.
s
]j (*(void(*)())0)(); \"f (void(*)())0 \¦ fp Ð @/uK Ð.
(*fp)(); // fp £Ûá (void(*)())0 s
כ Ér <Êú í' fp ovH <Êú\¦ ñئ H כ s.
#
lt sKÙþ¡, s]j ÂÒ sK ÷&%3`¦ כ s. õ&hܼР(*(void(*)())0)();
H 0 t\ [þt#QeH ÅÒè\¦ <Êú_ r tÐ "f ñئ H ("é¶A_ _
¸H &háÔ H) " î§îëHs.