设为首页收藏本站|繁體中文 快速切换版块

 找回密码
 立即加入
搜索
查看: 975|回复: 0

函数与函数指针 (必须弄清楚)

[复制链接]
  • TA的每日心情
    慵懒
    2016-4-21 12:07
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    累计签到:3 天
    连续签到:1 天
    发表于 2010-5-14 07:04:59 | 显示全部楼层 |阅读模式

    马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!

    您需要 登录 才可以下载或查看,没有账号?立即加入

    ×
    C中最重要 最难的就是 指针咯!" F- t! I* L: b7 B! `' j+ M

    $ R/ n- [+ k, S1 T, v" T- U
    , Y6 L; @8 |! ^$ m/ t2 P; r+ E在学习C++的回调函数机制时有一个关于函数名和函数指针的疑惑,如是就自己研究了下二者的关系。% A# J; m4 n4 I! Q1 }; X
      快速排序的原型:
    5 Q0 c8 n9 Z. M( e  void qsort(void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));
    8 O3 ~  {9 K: b6 t$ C  可见qsort接受一个类型为_USERENTRY的函数指针fcmp,但是下面代码中qsort函数接受一个函数名,却不是一个函数指针。而函数名和函数指针的关系如何呢?
    7 u$ ]6 Y% b( L" a #include <stdio.h> ! E* |& E8 r% b. V* {% Z9 {
    #include
    <stdlib.h>6 C9 k( S0 W8 s+ @1 A, J4 r
    int sort_function( const
    - n0 E9 |, u$ g+ `; \- L0 t8 U" Yvoid) W& {, J$ }. K: Y
    *a, const
    2 Y' ]% e( I. H3 O" M" Wvoid
    % p& k; o( o: s: J# ]*b);
    * e* k+ `. s# E+ Q
    int list[5] = { 54, 21, 11, 67, 22 };
    5 s1 f+ h7 ^, z8 F
    # O6 q6 e) i# i0 B
    int main(void) 5 l6 J- Y8 ~# j3 d' X
    { 1 H5 k+ G: m6 K8 j: [, s6 q
       
    int x; $ f& c" e& C* P* F
    - Y' O4 s+ C$ y1 G( I
       qsort((
    void7 A' A# I# @& k
    *)list, 5, sizeof(list[0]), sort_function); 6 A- x6 g  b; h
       
    for (x =
    , F5 g& {$ F* |6 [2 Q0; x <7 i8 q# B; n, V5 d  D# @
    5; x++) 8 [. n# v0 s: F1 D: j# j( X9 r9 ?
       printf(
    "%i\n", list[x]); * ~: w. k+ F. H
       
    return
    & _. Z% W4 B2 c0; + o4 j) q4 I! L+ v2 ]$ G& E
    }
    ; R; c( b: ?# `" I6 H; L7 K: U# N1 V2 P8 c# q
    int sort_function( const+ w$ e: n! h6 D; E( K2 F
    void+ C3 S! \) [$ \) R
    *a, const
    4 a3 ?6 Y, m; \! d4 |& [void
    . `) m7 X0 c0 o9 I  E4 H*b)
    + V; W$ [6 W  M5 \3 z! W/ e# D% ?{
    - ~1 {0 H8 x0 O   
    return) h4 F: u( o& M4 ]3 x
    *(int*)a-*(int*)b; & ^* p# R% v1 T0 Q9 ~& k* B
    }
    " `1 a' s1 Y/ D- i

    # B% {7 |5 N6 b; T; X# U1 j6 }8 Q0 S

      u$ Y8 _  W7 H, X" f) O# t  函数指针实际上就是该函数代码段开始的地址。其实,编译器对于函数名、函数指针都是转换为一个地址,这个地址就是该函数代码起始地址。! I1 z- ?, H3 \% u, X. f
      下面的代码说明了函数名和函数指针的关系:#include<stdio.h>
    & ~; `* z- e- e" R5 o; D% {0 k! F; B) O7 D6 j) q. [- w8 B
    ! c0 i7 i( B% L7 \3 ~5 O0 F
    void MyFun(int x);
    # o5 E, `% l, |& n- i5 I# Ntypedef
    void (*FunP)(int); ) ?% E& o: t6 D: J! Y( E4 x0 ~
    - S3 }1 o& w1 S( L
    FunP fp1
    = NULL, fp2 = NULL, fp3 = NULL, fp4 = NULL ;# X9 D- f% O8 S% F! L
    - A) i& B6 a( W4 K' f
    int main(int argc, char* argv[])9 X7 t! S9 E$ q- ^$ n& V+ S8 Q
    {
    2 A/ m* v- }6 f; f5 j5 U' l   MyFun(
    10);                        //这里是调用MyFun(10);函数2 c. c5 k# H" S, W4 Y

    - h# [4 U7 p5 I+ ^0 P   fp1
    =&MyFun;                       //将MyFun函数的地址赋给FunP变量" d# S: Z% b+ H2 e, H9 {, ?
      (*fp1)(20);                        //通过函数指针变量FunP来调用MyFun函数的。                        ; X4 T, G' \* s. [; X3 s4 n

    * o$ h- ?5 m6 x4 [   fp2
    =&MyFun;                        
    # w" O, X, v: s/ b3 ^   fp2(
    30);   
    3 p( i+ `. @+ C& G- c+ t. ?
    * o6 B% A: f2 U. D   fp3
    =MyFun;                        
    , F; B3 ?* h4 W* t1 L* w   fp3(
    40);    + f# Y2 ?; p: Z3 T

    / X* W8 h* h6 R6 f. H" v5 v   fp4
    =MyFun;  5 P6 F/ I7 I3 m# q2 r' q
       (
    *fp4)(50);   " i: Q+ b2 S: V! E$ v# {

    6 q! p7 j. N5 F4 o3 t' T   
    return3 P( u0 I$ W1 N  s% @& A, y: r
    0;
    0 b) O* K& X$ u* q  t9 G}: S& q* r9 O6 i# U+ [9 Q

    2 ^' Y  m+ l$ \' |+ x
    void MyFun(int x)                     //这里定义一个MyFun函数6 e6 q: ?! n, b) }/ L! v; O. v9 h0 `
    {
    % K$ y( W+ g+ i4 H4 L* R   printf(
    "%d\n",x);2 ^. G7 G% f$ W2 O- Z1 Z
    }
      n6 `% f! u6 q2 m8 C  d

    9 t0 l2 u9 i( V/ y7 R
    $ U7 T7 j6 z4 [/ e/ d7 ?7 [: b6 v9 A' a" \! y$ C. i3 y6 C
    1. 可见,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。
    8 t8 z5 q* J* h5 F" N2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用        (这样方便多了并与数学中的函数形式一样)。0 T; d2 J* q9 h+ g6 w+ p
    3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。7 i- a4 q+ R* D* u' u5 h1 e, _
    4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun
    "真诚赞赏,手留余香"
    还没有人打赏,支持一下
    楼主热帖
    帖文化:【文明发帖 和谐互动】 社区精神:【创新、交流、互助、共享】
    您需要登录后才可以回帖 登录 | 立即加入

    本版积分规则

    招聘斑竹

    小黑屋|手机版|APP下载(beta)|Archiver|电力研学网 ( 赣ICP备12000811号-1|赣公网安备36040302000210号 )|网站地图

    GMT+8, 2025-4-4 15:18

    Powered by Discuz! X3.5 Licensed

    © 2001-2025 Discuz! Team.

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