a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 185|回复: 3

[程序员] 2012年软件水平程序员考试综合辅导(四)

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。) 1 E# b: R; @& f, d  m, a
  1.怎样说明一个函数指针变量呢?8 D. s" [& l, j9 q/ M
+ d6 N% @% _/ h& h, ~
  为了说明一个变量fn_pointer的类型是"返回值为int的函数指针",你可以使用下面的说明语句:
2 i0 }' G+ Y1 U: J  s. V0 K0 K
7 N+ k* a) _+ ^  int(*fn_pointer)();4 R( g9 Y) X. W& V/ @, j: s

  o9 ]( S' p9 j( q& F6 B  为了让编译器能正确地解释这句语句,*fn_pointer必须用括号围起来。若漏了这对括号,则:$ f7 N2 z2 F2 d' g) j) z: V

8 H5 _# \# A' {  int*fn_pointer();- r( I) P3 v: Q0 c' }6 M4 j# A

- }+ p: r( T! m9 Y+ M  的意思完全不同了。fn_pointer将是一个函数名,其返回值为int类型的指针。
( P! D$ P6 C$ C4 Y4 m: }- R
& P: A8 M, a0 L& c' M4 ?% U  2:函数指针变量
) ~! j6 V, y  r+ s3 ]) i0 t( M! }3 b; w3 c2 H
  在C语言中规定,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为"函数指针变量"。4 A" @/ R: P: t7 f- L
* ?) H, U# }- }4 \0 M4 ]. R# c  v
  函数指针变量定义的一般形式为:6 Z  Q7 ~1 ]* r9 @# U

  b6 Y; c/ p( c: G  类型说明符(*指针变量名)();6 `. b- B% q, c( n
3 c2 G0 @* j& z; A& N7 N3 k
  其中"类型说明符"表示被指函数的返回值的类型。"(*指针变量名)"表示"*"后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。
! O2 o7 t$ C2 ]/ {2 X' i+ p, U
3 E& y$ T, ?, J; M! y; M  例如:int(*pf)();
, ^- r$ y  C3 g! i  L3 Y1 k+ [! m+ |3 ]6 W
  表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。% j( z; u& E3 Z& i! D- u
% ]: K4 g2 [. c, u
  下面通过例子来说明用指针形式实现对函数调用的方法。: H. E4 O* [- a% u8 b/ A5 _3 j

+ C% \  O' j; k  intmax(inta,intb). c: F! _% g3 d& W2 F
2 A* X3 I: n, _! e4 T  z0 M
  {
* J1 J! x+ b7 v1 Y
, T$ f' C8 H: i7 t  if(a>b)returna;
8 I$ ?2 t0 z  \* c, X
, |- s0 S7 y2 W7 v$ `; U$ ?0 w  elsereturnb;
3 ?/ ]7 ?& w1 Y2 k" g8 V2 z! O7 C. F2 ]$ ]& L
  }
9 ~, f7 v" r: d5 B) K7 r- W1 x" T7 b* ?; B3 _. `* Y7 P
  main()
4 o, _' h& }/ u0 ^. E. ?+ S; v# M* B; K, n& m* ?! X
  {
回复

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:16 | 显示全部楼层

2012年软件水平程序员考试综合辅导(四)

intmax(inta,intb);
2 {: e$ F9 ~1 _$ T# H) S2 w6 h  int(*pmax)();1 B' F6 N) z0 x; k& @! f, m
8 B! k; W/ o6 {8 E, B4 b! z
  intx,y,z;
- g. [8 [2 p- W7 d6 c9 t1 y( g( j  [& q' n4 k6 j  T
  pmax=max;# m; l1 c# N, l' L
+ R/ j9 w0 H$ m. _9 u( @+ P& c9 e
  printf("inputtwonumbers:/n");
4 ?% S6 {; |5 Z; I/ u% ?3 F: }1 }4 H* U8 n
  scanf("%d%d",&x,&y);/ D+ P  U7 N0 H* _3 ~  @

: L2 V" O* i7 c  z=(*pmax)(x,y);
$ ]& s& Q0 t0 f0 u& M+ {  V' h+ D, i2 i/ d. Q! M
  printf("maxmum=%d",z);9 n+ P% j& W7 p

# W/ c) S  k6 b( \  }
- {- R2 g" F$ W$ {1 u
5 @4 t+ M( p5 `# s5 h' X4 X  从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:, \+ }! y6 [0 u" Z% Y' ^( d0 }, Z

$ D$ r: S& \' z3 [, Y  1>.先定义函数指针变量,如后一程序中第9行int(*pmax)();定义pmax为函数指针变量。
& E1 a: R1 B4 d4 Q/ j/ X
9 A1 g$ t* c# Q  @  2>.把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行pmax=max;
0 [0 {/ }# B( W2 w3 S: a
& B* ~9 @+ N9 D7 r  A3 S6 \  3>.用函数指针变量形式调用函数,如程序第14行z=(*pmax)(x,y);调用函数的一般形式为:(*指针变量名)(实参表)使用函数指针变量还应注意以下两点:
# t. j5 A/ F* D; m- r* W+ r3 \4 M2 E0 @
  a.函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。# |6 `6 ^+ `. y( k: |
: n5 ?$ |' F' i5 s( h: J" K5 G0 j
  b.函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。% N% s- x1 g5 D8 |" q! h+ ?5 }' T

5 M. }0 l( I: V$ m2 p' ]  3:指针型函数* W5 @3 d7 C7 ?

9 D( u6 [: z, z2 |8 ~, Q& |( J  前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。; L7 ?3 @- N6 `
3 o3 Z+ J" A" S. H3 I! n( E
  定义指针型函数的一般形式为:* d! u4 Q( `7 p5 V2 K7 [
2 D0 I8 z3 ?+ l; G! g
  类型说明符*函数名(形参表)
: C: z2 Z  O$ m" F) D4 s! @
6 P1 h* Y) g' r! l9 O  {
' `* _' ~; ?# j
; {" T1 ^& j: e) ?" T' L6 {  ……/*函数体*/
: W* I6 T1 t' |! k  |( ?% w& M( u) ^2 |4 X- I+ N
  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:17 | 显示全部楼层

2012年软件水平程序员考试综合辅导(四)

其中函数名之前加了"*"号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
( D/ j4 V' L0 W) P* u  如:! v1 s: y! I$ g9 V% A0 ?

7 {" L6 y  R7 j* u  int*ap(intx,inty)! V5 q: g: |: Y2 z( F

% Z5 V7 G' ?6 F- c* C  {
* M: Q! o, h6 B5 [+ `3 y0 Q
2 q" V- c$ g% r3 F  ……/*函数体*/
, f& L3 @8 }" p) y; X( ]
7 y4 m* G7 G3 [* M9 C( G6 k; i  }5 @9 l& T/ `' k5 n3 e
+ Q; l2 Q. ]1 N$ N/ q3 i. J

" o9 _& K, z* p6 X  表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。下例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串"Illegalday"。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:18 | 显示全部楼层

2012年软件水平程序员考试综合辅导(四)

 if(i%s/n",i,day_name(i));</p>4 s( w* j$ I6 n0 t7 o+ n
  }
8 t5 t, N! |! C' Y6 C2 J: D, c) B% b2 Q) Z
  char*day_n
- M' [7 h8 D  H- W. A" }
" Q7 b. O) z2 p: F% J  ame(intn)
$ v+ ?7 D/ P0 t8 \; c3 N4 x% N
8 n' }1 q: E8 W; l( P  {) v0 H9 ~3 j( {& C
# T* j$ }4 E. i  d0 R
  staticchar*name[]={"Illegalday",# }5 N7 {3 [# J; L. r/ n

" c% x' N5 ]7 D7 j& x/ A  "Monday",
1 @/ s' A5 Y# g# l) e5 |. \* V4 I* }5 L: W" v
  "Tuesday",6 g5 H5 B" V: Z
; j5 U# j4 q, k7 s4 ^; K
  "Wednesday",3 W+ V; M. e. c2 \7 d

4 A- \) A' L! {6 A& X8 ]  "Thursday",* ~. j; O1 ?( d( t
% J% M# Q# L$ D
  "Friday",5 G1 U9 B/ r8 V- e) \

/ I5 q: e% p+ g. @  "Saturday",0 m/ W; F8 m2 Q0 B! O& F
/ m/ V2 [- L% i7 d2 W* m- N' y
  "Sunday"};
9 F# m) k! ?. w  V, f+ w9 ^. A% W% N9 A
  return((n7)?name[0]:name[n]);! n: r8 P8 N) _8 e* j

8 a4 F3 `, y/ ?; Y! Y& s  }3 w) c5 ]# M* U2 [6 p
; @2 ]$ @7 o/ B/ k& O$ a
  本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。指针数组的说明与使用一个数组的元素值为指针则是指针数组。指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
  E% [2 B* S, m2 }( {9 |: k* i; n
  指针数组说明的一般形式为:类型说明符*数组名[数组长度]. q  }0 _$ A1 `; f) W+ [

* D+ L& l7 j- }3 y  其中类型说明符为指针值所指向的变量的类型。例如:int*pa[3]表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。通常可用一个指针数组来指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。图6—6表示了这种关系。
+ z  i: U' x) K! l7 Y) ^9 U6 u# v; w
% I2 H) u" c( G: E% k5 u  inta[3][3]={1,2,3,4,5,6,7,8,9};( j  _3 R( C: G
" O& J/ [) Z$ f  \: L
  int*pa[3]={a[0],a[1],a[2]};
8 s1 D9 l# o  F$ C
7 H1 v; A8 a& b  k6 T' f7 q  int*p=a[0];# @; D# `+ O" s; d
  main()
. Z6 l7 p5 w6 V; E* {( ^* l+ N  m$ t! r7 i: T4 [3 t- G6 Z
  {- r8 X9 f0 i& q# z. q" j& {

) u8 U4 J6 @" s5 q) o3 H  inti;
8 v+ Q. o# w: \6 B: k5 l2 p
4 U! z2 W, |% H0 x$ K" B# i3 Y3 l6 `. V/ x0 U! I# }+ K
  for(i=0;i
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 09:29 , Processed in 0.214520 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表