精华内容
下载资源
问答
  • 所谓函数指针数组就是在之前的函数指针的基础上增加了[],由于[]的优先级高于*,故 pf先与[]结合,说明它是一个数组,再与*结合说明数组中的元素的类型是指针,再看后面的参数列表,说明每一个指针都指向一个函数的...

    一、函数指针数组

    1.1函数指针数组的声明

          函数指针数组的声明如下,所谓函数指针数组就是在之前的函数指针的基础上增加了[],由于[]的优先级高于*,故 pf先与[]结合,说明它是一个数组,再与*结合说明数组中的元素的类型是指针,再看后面的参数列表,说明每一个指针都指向一个函数的入口地址,并且指向的函数的返回类型为int。

    int (*pf[])(int, int);

    1.2函数指针的使用

          以下代码展示了函数指针数组的一个简单的应用。

    #include <stdio.h>
    
    int Add(int x, int y)
    {
    	return x + y;
    }
    
    int Sub(int x, int y)
    {
    	return x - y;
    }
    
    int main()
    {
    	int a = 10;
    	int b = 20;
    
            //定义一个有2个指针的数组,指针指向一个函数,该函数有两个整型参数并返回一个整型数
    	int(*p[2])(int, int);
    	p[0] = Add; //函数指针数组的第一个元素指向Add函数
    	p[1] = Sub;
    
    	printf("%d, %d\n", p[0](a, b), p[1](a, b));
    
    	system("pause");
    	return 0;
    }

    二、指向函数指针数组的指针

          在此,仅作介绍,它也叫函数指针数组的指针。下面的定义怎么理解呢?首先,p和*结合说明是一个指针,之后与[]结合,说明是一个数组指针,再与*结合说明用一个指针指向了数组指针,之后又指向了一个函数的入口地址,该函数有两个int类型参数,返回值是int。

    int (*(*p)[])(int, int);

         总而言之,指向函数指针数组的指针就是在函数指针数组的基础上,再加一个*表示一个指针去指向它。当然,既然有函数指针数组的指针,则必然还有函数指针数组的指针数组,只不过一般的编程用到的情况很少,如果读者有兴趣的话,可以去研究一下。

    展开全文
  • C语言中,我们知道,指针变量一种特殊的变量,专门用来...指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针 1.指针数组  指针数组强调的是数组,并且数组元素是指针类型 例:int *arr[5]//ar

    C语言中,我们知道,指针变量一种特殊的变量,专门用来存放其它变量的地址。因此,指针也可以说就是地址。但是,需要注意的是:什么类型的变量应该存放在什么类型的指针变量中。接下来我们对各类指针做一个讲解,希望能够帮到大家。分别有:

    指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针

    1.指针数组
      指针数组强调的是数组,并且数组元素是指针类型
    例:int *arr[5]//arr是一个数组,数组元素是指针(int*)

    2.数组指针
      数组指针强调的是指针,并且这个指针指向一个数组,即指针变量存放的是数组地址
    例:int (*arr)[5]//arr是一个指针,并且指向一个含有5个整型元素的数组

    3.函数指针
      函数指针强调指针,并且这个指针指向一个函数,即指针变量保存的是函数的地址
    例:void test(char* str);
    void (*p)(char*)//p是一个指针,并且指向一个函数,这个函数参数是char*,返回类型是void型

    4.函数指针数组
      函数指针数组强调数组,数组元素是函数指针
    例:void test(char* str);
    void (*p[5])(char*)//p是一个数组,有五个元素,每个元素是函数指针,这些指针指向的函数参数是char*,
    返回类型是void型

    5.指向函数指针数组的指针
      指向函数指针数组的指针强调指针,这个指针指向一个函数指针数组,这个数组中的元素是函数指针
    例:void test(char* str)
    void (*(*pfun)[5])(char*)=&test
    //pfun是一个指针,指向一个含有5个元素的数组,数组元素为函数指针,
    这个函数参数是char*,返回类型是void型

    展开全文
  • 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,即指针指向该函数的内存首地址,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。 这种指针就是函数指针。 p=函数名;//...

    1. 函数指针的定义

    一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。

    我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,即指针指向该函数的内存首地址,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。

    这种指针就是函数指针

    p=函数名;//p为指针变量
    

    2. 函数指针的定义形式

    2.1 一般定义方法

    returnType (*pointerName)(param list);
    

    returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。

    注意( )的优先级高于*,第一个括号不能省略,如果写作returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为returnType *。

    例:

    void (*irq_func)(void);
    

    定义了一个函数指针irq_func,指向的函数接收一个整形参数且无返回值。

    2.2 加上typedef关键字的定义

    typedef void (*irq_func)(void);
    

    加上typedef关键字后,irq_func就不再是一个单一的函数指针了,而是一种数据类型,是指向“无形参且无返回值”这种类型函数的函数指针类型。

    我们可以利用irq_func去定义具体的函数指针。
    例如:

    void test(void)
    {
    	printf("hello world!\n");
    }
    
    typedef void (*irq_func)(void);
    
    irq_func p_test_1=test;//定义一个指向函数test的函数指针p_test_1。
    irq_func p_test_2=&test;//函数指针指向函数地址时候,可以加取地址符号&,也可以不加,效果等同。
    

    注意:函数指针指向函数地址时候,可以加取地址符号&,也可以不加,效果等同。函数名是一个地址,可以将他赋值给一个指向函数的指针。前面加了&符号其意义是一样的。这些都是设计语言时这样规定的。

    记住:只要加上typedef,就是定义了一种新的数据类型,或为已存在的数据类型进行重命名。这里属于第一种。

    3.利用函数指针调用其所指向的函数

    3.1 情况1:一般调用

    int test(void)
    {
    	return 6;
    }
    
    typedef int (*irq_func)(void);
    
    irq_func p_test_1=test;
    

    问:当我们向使用函数指针p_test_1来调用函数test时,下列哪种方法是正确的?

    第1种写法:

    int i;
    i=p_test_1();
    

    第2种写法:

    int j;
    j=(*p_test_1)();
    

    答:以上两种写法都可以。最终效果一致,变量 i 和 j 的值均为6.

    3.2 情况2:函数指针做为结构体成员

    当函数指针是一个结构体变量的成员时,此时怎么正确调用此函数指针所指向的函数?

    问:此时下面三个调用函数的写法哪个正确?

    #include "stdio.h"
    
    int test(void)
    {
    	return 5;
     } 
     
     typedef struct haha
     {
     	int (*p_test)(void);
     }haha,*p_haha;
     
    haha cw=
    {
    	.p_test=test,
    };
    
    p_haha p_cw=&cw;
    
    int main(void)
    {
    	int i,j,k;
    	
    	/*写法1*/
    	i=cw.p_test();	
    	printf("i =%d\n",i);
    	
    	/*写法2*/
    	j=cw.(*p_test)();
    	printf("j =%d\n",j);
    	
    	/*写法3*/
    	k=(*(cw.p_test))();
    	printf("k =%d\n",k);
    }
    

    答:写法1,3正确。写法2错误。
    C语言中,‘.’运算符的优先级很高,比 * 高。

    第二种写法是在找cw的(*p_test)成员,这里显然是没有的,改成:(*(cw.p_test))()就没有问题,指向函数的指针说白了也就是一个特殊的变量而已。需要首先要通过’.'运算符获取到这个成员变量,才能使用这个变量。cw.p_test是获取变量的过程,不可以拆开的。

    如果用结构体指针p_cw来调用test函数,则正确写法是(*(p_cw->p_test))()

    (这里需要特别感谢CSDN的“Frankenstein_Quasimo”的解疑回答!)

    参考资料:https://blog.csdn.net/zhangzhi123456789/article/details/49253171

    展开全文
  • 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针函数指针的定义形式为: returnType (*...
  • 首先我们来科普一下关于指针的小常识:指针相关概念指针数组 【int *p[4]】是数组,是一个存放指针的数组数组指针 【int (*p)[4]】是指针,该指针有能力指向一个数组函数指针 【char* (*fun)(char* p1, char* p2)】...

    前言:

    对于指针,我们都知道是c/c++里的硬骨头,但之所以硬,才有细嚼慢咽的理由,今天我们一起来分析分析指针的精髓。

    首先我们来科普一下关于指针的小常识:


    指针相关概念
    指针数组 【int *p[4]】
    是数组,是一个存放指针的数组
    数组指针 【int (*p)[4]】
    是指针,该指针有能力指向一个数组
    数指针 【char* (*fun)(char* p1, char* p2)是指针,该指针有能力指向一个函数
    函数指针数组 【char* (*fun[4])(char* p1, char* p2)是数组,是一个存放函数指针的数组
    指向函数指针数组的指针 char* (*(*fun)[4])(char* p1, char* p2)是指针,指针指向一个数组,数组的元素为函数指针
    .............

    嘿嘿 ,是不是很懵?懵就对了,接下来就是见证奇迹的时候:


    1.指针数组

    首先这是一个数组, 而数组中存的是指针,强调的是数组,数组,数组。重要的话说三遍。还有数组占多少字节由数组本身决定。它是“储存指针的数组”的简称。这里需要明白一个符号之间的优先级的问题,“[ ]”“ * ”的优先级要高,p1会先和“[ ]”结合,构成一个数组,数组名为p,int *修饰的是数组的内容,即数组的元素。那么int *p[4];就清楚了,它是一个数组,存了4个指向int数据类型的指针,即指针数组。 


    2. 数组指针

    那现在清楚了,它是一个指针,它指向数组,强调的是指针,指针,指针。你懂得。这个指针是指向一个数组的,int (*p)[4];就更好解释了,在这儿()的优先级比[]的优先级高,那么 p 先和*结合,说明 p 是一个指针,p是指针变量名。int修饰数组的内容,即数组的每个元素。数组在这里没有名字,是一个匿名数组,p 是一个指针,它指向一个包含4个int类型数据的数组,即数组指针。 

    还不清楚,别担心,有图有真相:

    3. 函数指针

    既然明白数组指针是什么东西,那么函数指针也一定知道喽。首先老套路,它是一个指针,没毛病,好,指向的是一个函数,说不清楚,看代码:

    char *(*fun)(char* p1, char* p2);
    • 1

    在给看个代码,会清晰很多。

    int (*)[4]   p;
    • 1

    这是什么?是不是定义的数组指针。 

    那么char* (*)(char* p1, char* p2) fun ;是什么?是不是定义一个函数指针。答案当然是滴,这时一个函数指针,fun 是一个指针变量名,指向一个函数,这个函数有两个参数,分别为字符指针 p1 和字符这个指针 p2 ,函数的返回类型是字符指针类型。那么我们把代码写成char* (*)(char* p1, char* p2) fun ;岂不是很好吗?的确很好,but 编译器不认,哈哈。所以应编译器与语法要求我们需要书写成char* (*fun)(char* p1, char* p2)


    4. 函数指针数组

    我们现在已经知道表达式char* (*fun)(char* p1, char* p2) ;定义的是一个函数指针 fun 。既然 fun 是一个指针,那么我们把它存在数组里好不好?不好也得好哈。看代码:char* (*fun[4])(char* p1, char* p2) ;看出来多了什么吗?考察你的眼力。我在fun 后面加了一个 [4],现在就把这个代码变成了一个函数指针数组啦。有意思吧,来来来,来看我分析。 

    char* (*fun[4])(char* p1, char* p2) ;它是一个数组,数组名是 fun 。数组中存了4个指向函数的指针。我把它变换一下 你在来看char* (*)(char* p1, char* p2) fun[4] ;对吧,清晰了吧。这4个指向函数的指针指向 。我的天哪!不难哈。^_^。重点是要明白这时一个数组。


    5. 函数指针数组的指针

    在忍忍,马上就可以看到胜利的曙光了,也不难嘛,这不就是一个指针嘛。这个指针指向一个数组,这个数组里面存的是指向函数的指针。看吧,我说的不难。 

    来来来,看代码:char* (*(*fun)[4])(char* p1,char* p2)。把变量名写在后边,在来看代码:char* (*(*)[4])(char* p1,char* p2) fun 听我解释:fun 首先是一个指针,这个指针指向一个包含了4个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。^_^。说的我都有点绕了,算了,你只要知道这是个指针就行。

    最后附上一个精彩的代码:

    (*(void(*)())0)();  
        //调用0地址处的函数,该函数为没有参数,返回类型为void的函数  
        //该代码是把0强转成函数指针,然后再解引用找到函数再调用  
      
    void(*signal(int, void(*)(int)))(int);  
        //是一个函数声明,signal是一个函数,  
        //参数为int类型和函数指针类型,返回值为函数指针类型  
    
    哈哈,今天git多少知识?欢迎跟小编探讨哦!
    展开全文
  • 可以定义指向函数指针变量,使用指针变量间接调用函数。 先用一个简单的程序来说明: #include <stdio.h> float max(float a,float b) { if(a>b) return a; else return b; } float min(float a,float b)...
  • c语言中,指针的用途十分广泛,而其与数组和函数的关系也十分密切。下面我们来简单介绍一些指针的应用。 1.指针数组  指针数组:首先它是一个数组,这个数组中的内容都是指针变量。如:int * parr [3] 是指一个...
  • 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针函数指针的定义形式为: returnType (*...
  • 指针 指针数组 指针数组的指针 数组指针 数组指针的数组 函数指针 函数指针数组 指向函数指针数组的指针
  • C语言指向函数指针

    2014-07-25 20:54:04
    (一) 用函数指针变量调用函数 ...可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例: 1 #include stdio.h> 2 #include stdlib.h> 3 4 int main() 5 {
  • // c指针 // // Created by stevenchang on 9/4/15. // Copyright (c) 2015 cz. All rights reserved. // #include void printfArray(int array[]); //声明一个函数,用于打印数组元素 char *returnName();
  • c语言函数指针和void *指向函数

    千次阅读 2018-08-22 14:52:12
    先说函数指针: void (*fun)(void); 这个就是一个函数指针了,函数的参数为空 void (*fun)(int); 这个也是一个函数指针,函数参数有个int 来看看void*类型: void *fun; 这样定义看起来很抽象,有...
  • 如何在C语言中使用函数指针 函数指针的定义 int (*p)(int,int); int代表的是指针变量名,两个int代表,函数参数有两个,且都为int型,当然以上定义只为示例,需要根据不同的函数,指定不同的参数类型和参数个数。...
  • 函数指针函数指针指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针。函数指针是将函数当做普通数据那样存储和管理。函数指针有一种固定的形式,就是包含一个确定的返回值类型和若干...
  •   C语言是一门面向过程的语言,而面向过程最大的利器就是函数,今天我们就来研究一下函数指针相关的话题。 1. 函数指针   首先看一个例子。 #include &lt;stdio.h&gt; #include &lt;stdlib...
  • 详解C语言指针函数、函数指针函数指针数组

    万次阅读 多人点赞 2018-07-09 11:08:24
    而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值...
  • C语言函数指针和回调函数的详解

    万次阅读 多人点赞 2019-05-18 23:10:01
    如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的...
  • 这是一个经过简化的可以选择功能的程序 主函数的意思是先定义函数指针*fun 然后指向排序函数 执行fun所指向的函数(就是排序) 然后排序函数会返回排好序的数组的首地址,最后进行输出 我知道这个算法肯定有错误 但是...
  • 可以定义一个指针变量,接收函数的入口地址,让它指向函数,这就是指向函数的指针,也称函数指针。通过函数指针可以调用函数,它还可以作为函数的参数。 函数指针的定义 函数指针定义的一般格式为: 类型名 (*...
  • 函数指针 1.定义理解 函数指针:是一个指针,存放函数地址的指针。 函数的地址可以通过取地址函数名拿到,也可以通过函数名直接拿到。2.函数指针 (1)定义一个函数test void test(char *str) {  printf("%...
  • C语言指向函数指针

    千次阅读 2018-04-20 19:17:19
    这里介绍了关于指向一维数组的指针, 相关内容可以参考该文. 本文将简要介绍指向函数的指针. 如何声明一个指向函数的指针? ...void print(int num);... // 声明指向函数的指针,...函数指针类型的通用形式: 返回类型 (...
  • 指向函数指针: void test() { printf("调用了test函数"); } int main() { void (*p)(); //(*p)是固定写法,表指针变量p肯定是指向函数 //左边的void:指针变量p指向的函数没有返回值 //右边的():指针变量p...
  • C语言函数指针与指针函数 最近在阅读cJSON的源代码,在看见如下代码是产生了,深深地疑惑,这个是什么声明...函数指针首先它是一个指针变量,其次它是指向函数的,正如每个变量都有地址,我们知道每一个函数也是都
  • C语言-函数指针

    2017-11-30 07:35:11
    C在编译的时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他变量一样。 用途: 调用函数和做函数的参数 函数...
  • C语言中指针为内存地址,可以指向变量,数组,同样也可以指向函数指向函数的指针成为函数指针函数指针指向被掉函数的首地址,可以通过它来调用函数。其定义方式为 类型说明符 (*变量名)(形参列表);其中...
  • 指针数组表达式为:int *p[5] 理解:下标运算符[ ]的优先级是要高于指针运算符*,因此p先和下标运算符结合,决定了p首先是个数组,其类型int *,表明数组的元素都是都是指针。而数组占多少个字节由数组本身决定。...
  • 前言一、返回指针的函数二、指向函数指针 说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 539,660
精华内容 215,864
关键字:

c指向函数的指针