`
andrew913
  • 浏览: 188844 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

函数指针详解

阅读更多
函数指针:函数的入口地址
C程序变量驻留在程序内存空间的某个地址,它所在的地方取决于变量类型(自动变量、静态变量或全局变量等)。我们可以很容易打印变量的地址,如下所示:

#include <stdio.h>
int main(void)
{
        int i = 3;
        printf("i resides at %p\n", &i);        //i resides at 0xbfef6c44
        return 0;
}
在程序中,操作符&作用于变量i,要求生成i的地址,而格式化标识符%p指定输出内存地址。上述程序的可能输出如下:
i resides at 0xbfef6c44
同变量一样,我们也可以打印函数的地址。下面这段代码说明了这一点:

#i nclude <stdio.h>
void func(void);
int main(void)
{
        int i = 3;
        printf("i resides at %p\n", &i);         // i resides at 0xbfe2f6f4
        printf("func() resides at %p\n", &func);  // func() resides at 0x80483fa
//        printf("func() resides at %p\n", func);   // func() resides at 0x80483fa
        printf("main() resides at %p\n", &main);  // main() resides at 0x8048368
//        printf("main() resides at %p\n", main);  // main() resides at 0x8048368
        return 0;
}
void func(void)
{
        printf("Hello, world\n");
}
对应的输出如下:
i resides at 0xbfe2f6f4
func() resides at 0x80483fa
main() resides at 0x8048368
实际上,函数也驻留在程序的内存空间中。地址操作符&也可以作用于函数,从而生成函数所在的地址。
如何声明函数指针
在C语言中,所有变量都需要声明和定义,函数指针也不例外。
变量和指针的声明及定义如下:
int i;
int *int_ptr = &i;
很自然会联想到:
int f(int arg);
int *func_ptr(int arg) = &f;
实际上,由于根据运算符优先级规则,括号的优先级要比指针高,因此这种形式定义了一个指针函数,也就是一个返回指向整型数的指针的函数。
函数指针的正确定义为:
int f(int arg);
int (*func_ptr)(int arg) = &f;
需要强调的是,函数指针和它所指向的函数应该是兼容的。下例给出了一些对函数及函数指针的错误赋值:

int func(int arg)
{
        return 0;
}
int *func_ptr1(int arg);
int (*func_ptr2)(int arg);
int (*func_ptr3)(void);
double (*func_ptr4)(int arg);
int main(void)
{
//      func_ptr1 = &func; //error: invalid lvalue in assignment
        func_ptr2 = &func; //pass
//      func_ptr3 = &func; //warning: assignment from incompatible pointer type
//      func_ptr4 = &func; //warning: assignment from incompatible pointer type
}
其中,只有第二个赋值是正确的。在示例一中,func_ptr1并不是函数指针,而是一个指向指针的函数。在示例三中,func_ptr3只能指向没有参数的函数,而函数func带有一个整型参数。而示例四中,func_ptr4只能指向返回double类型的函数,而函数func返回的是int类型。
如何获得函数的地址
有两种方式获取函数的地址。假设funcptr是一个函数指针。如果我们将它指向一个兼容函数func()。
第一种方法使用隐式指针转换(implicit conversion to pointer):
funcptr = func;
第二种方法使用显式指针转换(explicit conversion to pointer):
funcptr = &func;
这两种方法都是可行的。实际上,如果在程序中有第一种形式的语句,编译器会把它自动转换为第二种方式。
使用函数指针调用函数
象获取函数的地址一样,通过函数指针调用函数的方法也有两种:
第一种是使用显式指针(explicit dereference of the pointer),如下:

extern void func(int x, int y);
void (*func_ptr)(int x, int y) = func;
(*funcptr)(3, 2);
第二种称为隐式指针(implicit dereference of the pointer)。
extern void func(int x, int y):
void (* func_ptr)(int x, int y) = func;
funcptr(3, 2);

函数指针的应用
分享到:
评论

相关推荐

    函数指针的详解

    ### 函数指针详解 #### 一、函数指针的概念 在C语言中,函数也是一种特殊的“对象”,它有自己的地址,即函数的入口地址。函数指针是用来存储这些地址的一种特殊类型的指针。通过函数指针,我们可以实现更加灵活的...

    函数指针详解 word文档讲解详细 很细

    函数指针是C/C++编程中的一个重要概念,它允许我们将函数作为其他函数的参数或存储在数据结构中,实现灵活的代码组织和执行。本文详细介绍了函数指针的三种主要用法:指向普通函数的指针、函数指针数组以及指向函数...

    函数指针详解[文].pdf

    本文详细介绍了函数指针在C++中的应用和使用,包括基本概念、函数指针数组以及指向函数指针数组的指针,并简要提及了函数指针与类成员的关联。 1. **基本的函数指针** 在C++中,函数可以被视为一等公民,它们可以...

    详解函数指针和指针函数

    【函数指针】是C语言中一种强大的特性,它允许我们使用指针来直接操作函数。函数在程序中被看作是一种数据类型,因此可以像处理其他数据一样处理它们,包括赋值、传递和作为参数。函数指针的定义包含了函数的返回...

    C++函数指针

    ### C++函数指针详解 #### 一、引言 函数指针是在C++编程语言中一种非常重要的特性,它允许程序员将函数当作数据来处理。通过对函数的指针进行操作,可以实现很多高级功能,比如动态绑定、回调函数、多态等。本文...

    C++获取类的成员函数的函数指针详解及实例代码

    在C++编程语言中,获取类的成员函数的函数指针是一项重要的技术,它允许我们动态地调用对象的成员函数。下面将详细介绍这一概念,并通过实例代码进行解析。 首先,我们需要理解成员函数指针的概念。成员函数是类的...

    C语言 函数指针分析

    ### C语言中的函数指针详解 #### 一、引言 在C语言中,函数指针是一种非常重要的概念,它允许我们将函数作为一种数据类型来处理。通过使用函数指针,我们可以更加灵活地控制程序的执行流程,实现回调函数、动态...

    函数指针和woid指针详解.pdf

    "函数指针和void指针详解" 函数指针是C语言中的一种重要概念,它允许程序员将函数作为参数传递或从函数中返回。函数指针的声明格式为:函数返回值类型(*指针变量名)(参数类型列表),例如:`int (*p)(int, int)...

    C++函数指针详解

     至于指针的详细学习,推荐这篇博文C++指针详解  与数据一样,函数也有地址,函数的地址是内存中存放函数语言代码的起始地址。函数指针是指向这个地址。函数指针所指向的类型,是函数本身。我们知道,指针所指向...

    函数指针和woid指针详解.docx

    函数指针和void指针详解 函数指针是C语言中的一种特殊的指针类型,它指向一个函数的入口地址。函数指针可以用来调用函数,並且可以作为函数的参数传递给其他函数。 函数指针的定义格式为:typedef 返回值类型 (*...

    C++中函数指针详解及代码分享

    C++中的函数指针是一种强大的工具,它允许我们存储函数的地址并以指针的方式调用它们,这在编写动态代码、回调函数以及实现元编程等高级技术时非常有用。下面我们将详细探讨函数指针的定义、使用以及一些相关的示例...

    c_c++指针详解 指针详解

    C/C++指针详解 C/C++指针是编程语言中的一种基本数据类型,它们可以指向内存中的地址,可以存储变量的值,也可以存储函数的地址。指针的使用可以提高程序的效率和灵活性,但是也增加了程序的复杂度和出错的可能性。...

    指针详解.pdf指针详解.pdf

    函数指针可以指向函数,允许将函数作为参数传递给其他函数。例如: ```c void my_func(void); void (*func_ptr)(void); // func_ptr是一个指向无参数且无返回值的函数的指针 func_ptr = my_func; (func_ptr)(); // ...

    函数指针与指针函数

    ### 函数指针与指针函数详解 在深入探讨函数指针与指针函数之前,我们首先需要理解几个基础概念:变量、数组、指针以及它们之间的关系。 #### 变量与指针 变量是在内存中分配的一个存储区域,用于存放特定类型的...

    最全的C语言指针详解

    指针定义与使用、指针与函数、指针与数组、指针与字符串、指针数组与多级指针 、指针与动态内存分配

    C++plus学习总结

    C++函数指针详解 C++中的函数指针是指向函数的指针,通过间接调用函数。函数指针可以分为两类:普通函数指针和成员函数指针。 普通函数指针 普通函数指针是指向普通函数的指针。声明普通函数指针的语法为:`int ...

Global site tag (gtag.js) - Google Analytics