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

函数与指针

c 
阅读更多

1. 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针的类型.如:

  1. #include<stdio.h>
  2. void fun()
  3. {
  4. }
  5. int main()
  6. {
  7. printf("%p %p %p/n", &fun, fun, *fun);
  8. return 0;
  9. }

这三个值的结果是一样的. 其实对于最后的那个*fun, 即使前面加上很多个*号, 其结果也不变, 即**fun, ***fun的结果都是一样的. 对于这个问题, 因为之前讲过函数是一种
function-to-pointer方式, 其会自动转换成指针的类型, &fun是该函数的地址, 为指针类型, fun是一个函数, 会转换成其指针类型, 而对于*fun, 由于fun已经变成了指针类型, 指向这个函数, 所以*fun就是取这个地址的函数, 而又根据function-to-pointer, 该函数也转变成了一个指针, 所以以此类推, 这三个值的结果是相同的.

2. 如何调用一个地址上的函数
如果知道了一个函数所在的地址, 可以将其强制转化成某一种类型的函数指针, 然后再根据这个指针去调用这个地址的函数. 如:

  1. #include<stdio.h>
  2. void f(int i)
  3. {
  4. printf("i = %d/n", i);
  5. }
  6. int main()
  7. {
  8. unsigned long add;
  9. add = (unsigned long)f;
  10. ((void (*)(int))add)(10);
  11. (*(void (*)(int))add)(20);
  12. return 0;
  13. }

使用(void (*)(int))的方式可以将一个地址转换成一个带int参数且没有返回值的函数的指针类型, 然后再去调用, 由于第1点中讲的function-to-pointer, 所以最后两条语句中加与不加那个*号效果都是一样的. 在嵌入式方面经常用到这种方式.

3. 函数指针数组的用法.
有时候需要定义一个数组, 其内容为一系列的函数指针, 然后对其进行调用, 如:

  1. #include<stdio.h>
  2. int max(int v1, int v2)
  3. {
  4. return (v1 > v2 ? v1 : v2);
  5. }
  6. int min(int v1, int v2)
  7. {
  8. return (v1 < v2 ? v1 : v2);
  9. }
  10. int sum(int v1, int v2)
  11. {
  12. return (v1 + v2);
  13. }
  14. int main()
  15. {
  16. int (*p[3])(int, int);
  17. p[0] = max;
  18. p[1] = min;
  19. p[2] = sum;
  20. printf("p[0] = %d/n", (p[0])(3, 5));
  21. printf("p[1] = %d/n", (p[1])(4, 6));
  22. printf("p[2] = %d/n", (p[2])(1, 2));
  23. return 0;
  24. }

虽然感觉这种方法有点累赘, 但是也算是一种使用的方式, 所以介绍一下.

4.返回一个指向数组的指针的方式
可以让函数返回一个指向数组的一个指针, 如:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int (*p())[10]
  4. {
  5. int (*m)[10];
  6. int i;
  7. m = (int (*)[10])malloc(10 * sizeof(int));
  8. if (m == NULL)
  9. {
  10. printf("malloc error/n");
  11. exit(1);
  12. }
  13. for (i = 0; i < 10; i++)
  14. *(*m+i) = i+1;
  15. return m;
  16. }
  17. int main()
  18. {
  19. int (*a)[10];
  20. int i;
  21. a = p();
  22. for (i = 0; i < 10; i++)
  23. printf("%d ", *(*a+i));
  24. printf("/ndone/n");
  25. return 0;
  26. }
复制代码

这种方式中,int (*a)[10]是一个指向一维数组的一个指针, 而p()也是返回一个指向一维数组的一个指针.

5.返回一个函数指针的指针
对这个问题, signal()函数是最好的例子,

  1. void (*signal (int signo, void (*func)(int)))(int);
复制代码

很多朋友刚开始看这个函数定义的时候是不太懂, 其实可以一步一步地慢慢看, 我以前是这样分析的, 希望能对大家有用.
int (*p)();
这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.
int (*fun())();
这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.所以说对于

  1. void (*signal(int signo, void (*fun)(int)))(int);
复制代码

就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数), 而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.
signal函数返回的其实是指向以前的信号处理程序的指针, 所以举一个例子来说明返回指向函数的指针的用法,如:

  1. #include<signal.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. void sig_fun2(int signo)
  5. {
  6. printf("in sig_fun2:%d/n", signo);
  7. }
  8. void sig_fun1(int signo)
  9. {
  10. printf("in sig_fun1:%d/n", signo);
  11. }
  12. int main()
  13. {
  14. unsigned long i;
  15. if (signal(SIGUSR1, sig_fun1) == SIG_ERR)
  16. {
  17. printf("signal fun1 error/n");
  18. exit(1);
  19. }
  20. (signal(SIGUSR1, sig_fun2))(30);
  21. printf("done/n");
  22. return 0;
  23. }

6. 使用函数指针作为参数的情况
在函数的参数中, 可能会带有一个函数指针, 这在signal()函数中是出现了的, 另外再写个例子如:

  1. #include<stdio.h>
  2. int max(int v1, int v2)
  3. {
  4. return (v1 > v2 ? v1 : v2);
  5. }
  6. int min(int v1, int v2)
  7. {
  8. return (v1 < v2 ? v1 : v2);
  9. }
  10. int sum(int v1, int v2)
  11. {
  12. return (v1 + v2);
  13. }
  14. int fun(int a, int b, int (*call)(int, int))
  15. {
  16. return (call(a, b));
  17. }
  18. int main()
  19. {
  20. printf("max=%d/n", fun(1, 2, max));
  21. printf("min=%d/n", fun(3, 4, min));
  22. printf("sum=%d/n", fun(5, 6, sum));
  23. return 0;
  24. }

其实在很多排序函数中就是使用的这个参数为函数指针的方式来进行调用的.

分享到:
评论

相关推荐

    C语言中的函数与指针.pdf

    三、指针与函数的关系 在C语言中,函数参数的传递方式默认是按值传递,即传递的是变量值的副本。这导致被调用函数无法直接修改调用函数中的变量值。为了解决这一问题,C语言允许使用指针作为函数参数,通过传址调用...

    剖析C_语言中的函数与指针的关系.pdf

    根据给定文件的信息,本文将深入探讨C++语言中函数与指针的结合使用,具体包括指针作为函数参数的应用、指针函数以及函数指针的相关概念和使用方法。 ### 函数参数中带有指针的情形 #### 指针作为函数参数 在C++...

    函数与指针[归类].pdf

    【函数与指针】 在C++编程中,函数和指针是两个非常重要的概念,它们在实际编程中有着广泛的应用。本实验主要涉及到如何使用函数处理特定问题以及指针在函数中的运用。 首先,让我们来看第一个题目。这个题目要求...

    c++中指向函数的指针

    除了直接使用函数指针调用函数,我们还可以将函数指针作为参数传递给其他函数,或者让函数返回一个函数指针。在上面的示例中,`RtnFunc`函数返回了一个指向`hello`函数的指针,而`call`函数接受一个返回字符指针的...

    指向函数的指针运用

    压缩包中的`指向函数的指针.cpp`文件应该包含了上述所有代码的实现,而`指向函数的指针.exe`则是编译后的可执行程序,运行这个程序将演示如何通过函数指针调用和比较两个积分函数。 总结来说,这个示例展示了C++中...

    指针函数和函数指针变量

    在C语言中,指针和函数是两个非常重要的概念,而将它们结合在一起,就产生了指针函数和函数指针变量。这两个概念是C语言高级特性的体现,它们在编程中有着广泛的应用,如回调函数、动态加载库、内存管理等。 首先,...

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    ### 彻底理解指针,指针数组和数组指针,指针函数和函数指针 #### 一、基础知识 在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的...

    函数指针和指针函数

    指针函数与函数指针不同,它是指返回一个指针的函数。换句话说,它的返回值是一个指针类型。在示例中: ```c int *GetDate(int week, int day) ``` `GetDate`是一个指针函数,它接受两个整型参数(一周中的星期和...

    函数指针和指针函数的理解

    ### 函数指针与指针函数的理解 #### 一、函数指针与指针函数的基本概念 在C语言中,函数指针和指针函数是两个重要的概念,它们经常出现在较为复杂的程序设计中,尤其在回调函数、动态绑定等场景中发挥着重要作用。...

    函数指针与指针函数应用程序

    在这个“函数指针与指针函数应用程序”中,我们将深入探讨这两个核心主题。 首先,我们要理解函数指针。函数在C/C++中被视为对象,可以被赋值、传递和返回。函数指针就是一个指向函数的指针,它存储了函数在内存中...

    函数指针和指针函数的区别

    在C/C++编程语言中,函数指针和指针函数是两个不同的概念,虽然它们都涉及到指针和函数,但其用法和含义各有特点。理解这两者的差异对于编写高效、灵活的代码至关重要。 首先,我们来解释"函数指针"。函数指针是一...

    C语言指针函数和函数指针详细介绍.

    C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...

    第六次上机——函数与指针.ppt

    本篇将详细解析第六次上机练习中涉及的四个部分:函数定义、声明与调用,数组作为函数参数,指针定义与引用,以及指针变量运算优先级和指针移动。 1. **函数定义、声明与调用**: - 函数定义是指在代码中具体写出...

    详解函数指针和指针函数

    函数指针的定义包含了函数的返回类型和参数列表,以确保与所指向的函数匹配。 1. **函数指针定义**:函数指针的声明语法是`函数类型 (*指针变量名)(形参列表)`。这里的`函数类型`指函数的返回类型,`*指针变量名`是...

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    #### 函数指针的理解与使用 **函数指针**是一种特殊的指针类型,它可以用来存储函数的地址,进而通过该指针来调用函数。理解函数指针的关键在于认识到函数也是一种具有特定地址的实体。 ##### 定义函数指针 函数...

    C/C++ 函数指针的意义,函数指针的用法

    ### C/C++ 函数指针的意义与应用 在C/C++编程中,函数指针是一种高级特性,它允许程序员处理函数的方式如同处理变量一般灵活。理解函数指针的意义及其用法,对于提升代码的可扩展性和灵活性至关重要。 #### 1. ...

    一般函数指针和类的成员函数指针

    这导致了类的成员函数指针与普通函数指针在声明和使用上存在显著差异。 ### 一、一般函数指针 #### 声明和使用 一般函数指针的声明必须匹配目标函数的原型,即包括参数类型、参数顺序以及返回值类型。例如,如果...

    函数指针就是指向函数的指针;类成员方法指针,类具有类域操作符

    类成员函数指针是C++中特定于类的特性,它们与普通函数指针有所不同。类成员函数总是与类的对象关联,因此它们有隐含的`this`指针,用于访问对象的成员。声明类成员函数指针时,我们需要指定函数的返回类型、类域...

    C51 函数指针与再入函数

    C51 函数指针与再入函数 函数指针是 C 语言中几个难点之一。由于 8051 的 C 编译器的独特要求,函数指针和再入函数有更多的挑战需要克服。主要由于函数变量的传递。典型的(绝大部分 8051 芯片)函数变量通过堆栈的...

Global site tag (gtag.js) - Google Analytics