电子产业一站式赋能平台

PCB联盟网

搜索
查看: 82|回复: 0
收起左侧

指针函数和函数指针

[复制链接]

493

主题

493

帖子

1868

积分

三级会员

Rank: 3Rank: 3

积分
1868
发表于 2018-2-8 16:56:00 | 显示全部楼层 |阅读模式
1.指针函数) u8 D, i; I/ T5 F. r8 I
先看下面的函数声明,注意,此函数有返回值,返回值为int *,即返回值是指针类型的。
; m& j( Y; p9 oint *f(int a, int b);
/ K& X9 v/ d+ {8 K上面的函数声明又可以写成如下形式:3 N! `& A) {! k6 r$ y
int* f(int a, int b);
# D: f1 v' ]2 }; k! m% H让指针标志 * 与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,f是函数名,返回值类型是一个int类型的指针。
  v2 n" Y. i3 F7 r$ @, t首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
& [# g+ F5 d* w. \# X+ }下面看指针函数的实现:
0 I1 j' Y' Y( H, c# T9 N# |+ ]   V2 J7 k/ k5 x; L( ?
int *f(int a, int b); // 声明指针函数9 b! J% I( I/ M4 d) F, {7 i
int _tmain(int argc, _TCHAR* argv[])# y- _; J" Q# O) O' W# i- I
{
2 D( o1 z! l6 s/ i7 c6 U7 S" jprintf("------------------------------ Start
. f1 T, v4 ?+ @& h  E");0 w( N  M  O  D7 B4 e5 E& U) Y
int *p1 = NULL;& h/ _& Z: b. a; P" O
printf("The memeory address of p1 = 0x%x ! O$ ?$ g9 y% x- ^9 d9 @6 Z
", p1);
8 ~% E& F' K0 A) G9 w7 |p1 = f(1, 2);
2 i& R! U% N: r, Iprintf("The memeory address of p1 = 0x%x
- m- P4 A, o- y", p1);3 p8 U1 e6 j* d: B" g! l
printf("*p1 = %d
1 w3 E& _4 v/ m", *p1);4 U" J  B& W% M
printf("------------------------------ End0 R8 t0 Y1 p# C0 ]% s7 g3 e+ I9 `7 Q
");
7 f3 ?% z: P- O/ ^getchar();
3 m" E+ }0 r) E! d6 A/ ireturn 0;
# `" X$ o/ Y' p' r}
5 R+ ?: p9 k/ t9 m' B/*
" n: s! }- P8 w* 指针函数的定义7 \* O. O( j# U* n! E3 D1 c
* 返回值是指针类型int *( W. D, w+ }/ ~% e
*/! c9 T. l' H: o; T( i# W' x
int *f(int a, int b) {
7 `) n% l$ L2 K: y* C- Jint *p = (int *)malloc(sizeof(int));
  l9 C+ v% i, Z1 [; rprintf("The memeory address of p = 0x%x
, _1 ]+ W! h0 k5 d! e' B+ `", p);
9 {4 y) V- U0 omemset(p, 0, sizeof(int));//将已开辟内存空间 p 的首sizeof(int) 个字节的值设为值 0) T% d5 Z6 \# R. e
*p = a + b;2 }6 i* m& g. x# B- {' u! ]
printf("*p = %d
: P5 }6 V2 Y5 J", *p);
, h8 _) B& h2 q9 N" Ireturn p;
- D9 \6 b$ |( E; p1 r}
: {# n# b2 @" x2 b  J $ p. G  I: @1 w& D5 k/ I
通过运行结果,可以看出,指针函数f返回的类型是一个指针类型,因为f是赋值给int类型指针p1的,如果不是指针类型,编译就会出错。. \8 S0 a" D" @6 u+ s
下面是运行结果:
- [" L. ^9 r8 h' G

xs2prywfban64010483334.jpg

xs2prywfban64010483334.jpg

9 P6 O- `8 B3 h
' k' \9 n9 `5 K2 ]1 H
  A2 I4 d* [: ~  n2.函数指针+ z, M$ g+ S- q/ A/ T; \8 K
顾名思义,函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象。
% M: P- s9 S7 [! f3 t# r# q函数指针的定义如下:
) ^2 Y, w- `7 o8 y. w/ g5 X$ rint (*f)(int a, int b); // 声明函数指针
8 m# m4 x# L4 U8 H通过与1中指针函数的定义对比可以看到,函数指针与指针函数的最大区别是函数指针的函数名是一个指针,即函数名前面有一个指针类型的标志型号"*"。6 b& M' N& c+ @( D
注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。- g8 g+ I: h; D' h, _. o  b
当然,函数指针的返回值也可以是指针。
6 E. t( C1 e0 Z1 H. c! U上面的函数指针定义为一个指向一个返回值为整型,有两个参数并且两个参数的类型都是整型的函数。
8 f0 G/ M. S4 j5 L0 b- Q: J( y下面是利用函数指针分别求两个整数的最大值和最小值的用法。
& h8 o) S* h/ b6 V* Y2 o/*1 ^' l. V5 [1 I
* 求最大值
# G2 t* }! ~6 P& {7 p* 返回值是int类型,返回两个整数中较大的一个7 Y+ j) x4 A& W% v6 v# Y
*/
0 N% x. U. G4 {6 ^6 vint max(int a, int b) {
$ E! s* ^1 n4 j- P3 a! d* }6 I  Mreturn a > b ? a : b;, ^2 `8 H. o! \5 _& V6 b
}  [, P+ @& H/ f  i  ~
5 {' y6 @8 x8 e/ S
/*0 W+ B5 x5 h( ?& u: B
* 求最小值! U7 J7 F7 o/ `0 J
* 返回值是int类型,返回两个整数中较小的一个4 R+ {8 h- J% y" X7 K
*/
: d+ e5 e! ^' N8 {% b! a  I6 k6 Y* jint min(int a, int b) {1 g$ b3 ]: ^! g2 M( x3 V  O
return a
# Q! w' ~# K6 |8 m6 \: _}; D( a0 s- v0 p( k

9 x+ J6 R+ v: o; ?int (*f)(int, int); // 声明函数指针,指向返回值类型为int,有两个参数类型都是int的函数
! ~& A3 A$ q' v2 j  B% o% I# I 5 w5 x* U# [* @9 i8 {
int _tmain(int argc, _TCHAR* argv[])
  Y$ ?3 s. r+ E' u1 M/ A- ~) J{
; C3 Z6 A6 I4 y6 s% o# _printf("------------------------------ Start& t: z. H& d2 L- Y; x; f: O! N/ J2 x
");
- \! m6 b# S3 x+ [4 @ $ j$ T3 {& q2 I
f = max; // 函数指针f指向求最大值的函数max0 F7 [# g  Y7 ^9 m2 W! F4 x9 I
int c = (*f)(1, 2);* C" e, c5 g/ I7 g* v

% s# B5 `0 T: V! _# uprintf("The max value is %d
1 N4 C/ S, v9 }' {4 R& Y0 X", c);
7 x& }4 F+ M) E" e+ t) D4 m
* b5 c4 h" T4 U# m; Ef = min; // 函数指针f指向求最小值的函数min6 X3 G1 t% ~5 r4 C/ {+ j% g5 p4 T
c = (*f)(1, 2);
1 ~( d+ `) S- n( n! L& M ' L; n2 c! Z' w' @
printf("The min value is %d " S, i: L7 h5 f6 o6 J5 E
", c);
5 y1 Y7 Z$ K% |' ?2 _) U1 M$ |, e
4 P$ h3 x% r& u7 Iprintf("------------------------------ End
' W' N1 V8 t3 q6 t");
  B) T; W. w- _' Lgetchar();. V2 Y9 I& h0 Y
return 0;
. ^/ v) F  \8 i6 }}* h& }+ a6 t: H
执行结果如下:+ d/ |  `5 j+ n$ O/ a9 J# G2 h4 o

px1rc3dli1e64010483434.jpg

px1rc3dli1e64010483434.jpg
回复

使用道具 举报

发表回复

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

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表