精华内容
下载资源
问答
  • 函数指针和指针函数用法和区别

    万次阅读 多人点赞 2018-05-24 08:11:10
    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,...

    前言

    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,然后好不容易死记硬背下来应付考试或者面试,然后过了几天发现,又是根本不会用,也不知道该在哪些地方用,这就尴尬了。
    今天这里只讲两个相对简单的,其实上面说那些太复杂的东西也真的很少用,即便是用了理解起来很麻烦,所以莫不如先深刻理解这两个比较容易的,并且项目中比较常用到。

    正文

    先来看看两者的定义以及说明。

    指针函数

    定义

    指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
    声明格式为:*类型标识符 函数名(参数表)

    这似乎并不难理解,再进一步描述一下。
    看看下面这个函数声明:

    int fun(int x,int y);
    

    这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。
    接着看下面这个函数声明:

    int *fun(int x,int y);
    

    这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

    这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。

    指针函数的写法

    int *fun(int x,int y);
    int * fun(int x,int y);
    int* fun(int x,int y);
    

    这个写法看个人习惯,其实如果*靠近返回值类型的话可能更容易理解其定义。

    示例

    (由于本人习惯于 Qt 中进行开发,所以这里为了方便,示例是在 Qt 工程中写的,其语法是一样的,只是输出方式不同)
    来看一个非常简单的示例:

    typedef struct _Data{
        int a;
        int b;
    }Data;
    
    //指针函数
    Data* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //调用指针函数
        Data * myData = f(4,5);
        qDebug() << "f(4,5) = " << myData->a << myData->b;
    
        return a.exec();
    }
    
    

    输出如下:

    f(4,5) =  4 5
    

    注意:在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。
    不过也可以将其返回值定义为 void*类型,在调用的时候强制转换返回值为自己想要的类型,如下:

    //指针函数
    void* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    调用:
    Data * myData = static_cast<Data*>(f(4,5));
    

    其输出结果是一样的,不过不建议这么使用,因为强制转换可能会带来风险。

    函数指针

    定义

    函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
    声明格式:类型说明符 (*函数名) (参数)
    如下:

    int (*fun)(int x,int y);
    

    函数指针是需要把一个函数的地址赋值给它,有两种写法:

    fun = &Function;
    fun = Function;
    

    取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

    调用函数指针的方式也有两种:

    x = (*fun)();
    x = fun();
    

    两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。当然,也要看个人习惯,如果理解其定义,随便怎么用都行啦。

    示例

    int add(int x,int y){
        return x+y;
    }
    int sub(int x,int y){
        return x-y;
    }
    //函数指针
    int (*fun)(int x,int y);
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //第一种写法
        fun = add;
        qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
    	//第二种写法
        fun = &sub;
        qDebug() << "(*fun)(5,3) = " << (*fun)(5,3)  << fun(5,3);
    
        return a.exec();
    }
    
    

    输出如下:

    (*fun)(1,2) =  3
    (*fun)(5,2) =  2 2
    

    上面说到的几种赋值和调用方式我都分别使用了,其输出结果是一样的。

    二者区别

    通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

    定义不同

    指针函数本质是一个函数,其返回值为指针。
    函数指针本质是一个指针,其指向一个函数。

    写法不同

    指针函数:int* fun(int x,int y);
    函数指针:int (*fun)(int x,int y);
    可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
    再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

    用法不同

    上面已经写了详细示例,这里就不在啰嗦了。

    总而言之,这两个东西很容易搞混淆,一定要深入理解其两者定义和区别,避免犯错。

    另外,本文都是针对普通函数指针进行介绍,如果是C++非静态成员函数指针,其用法会有一些区别,在另外一篇博客中单独介绍,文章在这里

    展开全文
  • 函数指针函数指针类型

    千次阅读 2018-09-29 08:48:59
    函数指针 1. 定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。 注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址 2. 语法 指向函数的指针变量...

    参考:https://blog.csdn.net/candyliuxj/article/details/6339414

    函数指针

    1.     定义

    每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

    注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址

    2.     语法

    指向函数的指针变量的一般定义形式为:

           数据类型   (*指针变量名)   (参数表);

    3.     说明

    • 函数指针定义形式中的数据类型是指函数的返回值的类型。
    • 区分下面两个语句:
    int (*p)(int a, int b);  //p是一个指向函数的指针变量,函数返回类型为整型
    int *p(int a, int b);     //p是函数名,函数返回类型为整型指针
    • 函数指针指向的变量不是固定的某一个函数的,只是定义了一个变量专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。
    • 在给函数指针变量赋值时,只需给出函数名,而不必给出参数。
    int max(int x, int y)     {    return x+y;    }
    
    void main()
    {
        //定义一个函数指针
        int (*p)(int a, int b);
        p = max;    //正确
        p = &max;    //正确
    
        //通过函数指针定义变量
        p(1,2);    //正确    
        (*p)(1,2);    //同样正确
    }

     

    • 在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。
    int fn1(int x, int y); 
    int fn2(int x);
    
    //定义如下的函数指针:
    int (*p1)(int a, int b); int (*p2)(int a);
    
    p1 = fn1; //正确
    p2 = fn2; //正确
    p1 = fn2; //产生编译错误
    • 函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用*(p+1)来表示函数的下一条指令。
    • 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。

    4.     举例

    源代码:

    #include <iostream>
    #include <conio.h>
    using namespace std; 
    
    int max(int x, int y); //求最大数
    int min(int x, int y); //求最小数
    int add(int x, int y); //求和
    void process(int i, int j, int (*p)(int a, int b)); //应用函数指针
     
    int main()
    {
    	int x, y;
    	cin>>x>>y;
     
    	cout<<"Max is: ";
    	process(x, y, max);
     
    	cout<<"Min is: ";
    	process(x, y, min);
     
    	cout<<"Add is: ";
    	process(x, y, add);
     
    	getch();
    	return 0;
    }
     
    int max(int x, int y)
    {
    	return x > y ? x : y;
    }
     
    int min(int x, int y)
    {
    	return x > y ? y : x;
    }
     
    int add(int x, int y)
    {
    	return x + y;
    }
     
    void process(int i, int j, int (*p)(int a, int b))
    {
    	cout<<p(i, j)<<endl;
    }
    

    函数指针类型

    通过typedef定义函数指针类型

    int max(int x, int y)
    {
    	return x > y ? x : y;
    }
    //定义函数指针类型
    typedef int(*pFun)(int, int)
    
    int main()
    {
        //通过函数指针类型定义函数指针
        pFun fun = &max;
        fun(1,2);
        return 0;
    }
     

     

    展开全文
  • 指针数组 首先从名字就可以知道这是一个数组,是存放指针的数组。 先看几种指针数组: int * 数组指针 函数指针 函数指针数组 指向函数指针数组的指针

    指针数组

    首先从名字就可以知道这是一个数组,是存放指针的数组。
    先看几种指针数组:
    int *arr1[10];
    char *arr2[5];
    char **arr3[6];
    因为 [ ] 的优先级是高于 * 的,所以数组名会先于 [ ] 相结合组成数组。 再于 int * / char *类型结合,组成存放该类型的数组。



    指针数组因为存放的都是指针所以不管是 int *   char * 还是 char ** 其大小都是四个字节。

    数组指针

    从名字看就知道是指针,是指向一个数组的指针。

    int (*p)[10];
    char (*p)[10];
    由数组指针知道 [ ] 的优先级是高于 *  的,所以用()来提升指针先结合。

    int (*p)[10];  //  是一个指向10个整形的一维数组的指针
    char (*p)[10]; //  是一个指向10个字符型的一维数组的指针

    数组的存储方式



    因为指向的是一个数组,所以大小由数组决定


    函数指针

    指向函数的指针,通俗的说也就是函数的地址
    void(*pfun)();
    pfun 先和*结合,说明pfun是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void
    也就是说 其可以保存函数的地址



    函数指针数组

    int (*parr[3])();
    parr先与 [ ]结合,说明是一个数组,再与*结合,说明数组存放的是指针,指针都指向的是函数
    函数指针数组的使用(转移表)
    例子:计算器
    #include<stdio.h>
    
    int add( x, y)
    {
    	return x + y;
    }
    int sub(x,y)
    {
    	return x - y;
    }
    int mul(x,y)
    {
    	return x * y;
    }
    int div(x,y)
    {
    	return x / y;
    }
    int main()
    {
    	int x, y;
    	int input = 1;
    	int ret = 0;
    	int(*parr[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
    	while (input)
    	{
    		printf("*******************************\n");
    		printf("***** 1.add         2.sub *****\n");
    		printf("***** 3.mul         4.div *****\n");
    		printf("*******************************\n");
    		printf("请选择:");
    		scanf("%d", &input);
    		if ((input > 0 && input < 5))
    		{
    			printf("输入你要计算的数:\n");
    			scanf("%d  %d", &x, &y);
    			ret = (*parr[input])(x, y);
    		}
    		else
    			printf("输入有误!\n");
    		printf("%d\n", ret);
    	}
    	return 0;
    }
    输出结果:


    指向函数指针数组的指针 

    这是一个指针,指向一个数组,这个数组是一个函数指针数组,数组中的元素都是函数指针

    定义方式:

    #include<stdio.h>
    void test(const char *str)
    {
    	printf("%s\n", str);
    }
    int main()
    {
    	void (*pfun)(const char*) = test;
    	//函数指针pfun
    	void (*pfunArr[5])(const char* str);
    	//函数指针的数组pfunArr
    	void (*(*ppfunArr)[10])(const char* str) = &pfunArr;
    	//指向函数指针数组pfunArr的指针ppfunArr
    	return 0;
    }




    展开全文
  • c/c++ 函数类型函数指针类型 详解

    万次阅读 2016-09-08 11:41:46
    今天解释下 函数类型函数指针类型 1.函数类型 在C语言中,函数也是一种类型,可以定义指向函数的指针。我们知道,指针变量的内存单元存放一个地址值, 而函数指针存放的就是函数的入口地址. ...

    c/c++ 中数据结构跟指针真的是很强大

    今天解释下 函数类型和函数指针类型

    1.函数类型
    在C语言中,函数也是一种类型,可以定义指向函数的指针。我们知道,指针变量的内存单元存放一个地址值,
    而函数指针存放的就是函数的入口地址.

    #include <stdio.h>
    
    void say_hello(const char *str);
    void (*fptr)(const char *);
    int main(void)
    {
        void (*fptr)(const char *) = say_hello;
        fptr("KingPlesk");
        return 0;
    }
    
    void say_hello(const char *str)
    {
        printf("Hello %s\n", str);
    }


    首先要理解的是 void (*fptr)(const char *)
    这是定义一个变量
    例如 void *ptr   这个是一个函数指针变量,不要把这个void (*fptr)(const char *) 当作一个声明定义。
    typedef 是一个类型声明的 关键字,

    void say_hello(const char *str);  函数也是一种类型,那么就可以用typedef来声明

    typedef void FUNC_HELLO_PTR(const char *str);

    —————————————————————————

    FUNC_HELLO_PTR   等于  void say_hello(const char *str);  声明

    FUNC_HELLO_PTR    *p = void (*fptr)(const char *str);  函数指针

    看下我写的一个实例:演示函数指针和 函数类型声明

    C++ Demo

    #include <iostream>
    
    void hello(void);//函数声明
    typedef void FUNC_HELLO_PTR(void);//typedef函数类型
    void (*hellotest)(void);//定义一个函数指针
    int main(int argc, char *argv[])
    {
    
        //使用函数类型指针方式调用
        FUNC_HELLO_PTR *t = hello;
        t();
        //直接使用函数指针调用
        hellotest = hello;
        hellotest();
    
        return 0;
    }
    
    void hello(void){
        std::cout<<"Test"<<std::endl;
    
    }


    展开全文
  • 函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。 而返回值为函数指针的指针函数就更难理解了,放在文章的最后来介绍。 函数指针 函数指针是一种特殊的 指针,它指向...
  • C++ 函数指针和函数类型

    千次阅读 2018-04-12 23:06:09
    函数指针和函数类型 函数指针指向的是函数而非对象。和其他指针类型一样,函数指针指向某种特定类型。 函数类型由它的返回值和参数类型决定,与函数名无关。 bool length_compare(const string &amp;, ...
  • 指针函数与函数指针

    千次阅读 多人点赞 2018-04-16 23:26:12
    2)函数指针指的是指向函数的指针变量,本质是一个指针变量。 2.声明和定义 1)指针函数声明 类型关键字 *函数名(参数列表) 例: int *fun(int a,int b); 2)函数指针声明 类型关键字 (*函数名)...
  • 我们已经学过C语言很长一段时间了,相信大家对于这个问题还不是特别的陌生,今天我们就来再次的...函数指针有一种固定的形式,就是包含一个确定的返回值类型和若干个函数参数。声明一个函数指针看起来与声明一个函数...
  • c语言函数指针_指针函数_返回值是函数指针

    千次阅读 多人点赞 2019-03-06 17:38:43
    函数指针作为函数的返回值 1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”...
  • 函数指针

    千次阅读 多人点赞 2019-05-25 09:43:47
    什么是函数指针 如果程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址,即是地址我们就可以定义一个指针变量来...
  • 函数指针,指针函数,返回值为指针的函数

    万次阅读 多人点赞 2017-06-08 21:23:17
    在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同函数指针就是一个指向...
  • 三、函数指针 四、函数指针数组 五、指向函数指针数组的指针 目录 1.指针数组 2.数组指针 3.函数指针 4.函数指针数组 5.函数指针数组的指针 一、指针数组 1.是一个存放指针的数组 2.举一个...
  • c++ 函数指针

    万次阅读 多人点赞 2019-06-15 21:41:38
    函数指针基础: 1. 获取函数的地址 2. 声明一个函数指针 3.使用函数指针来调用函数 获取函数指针: 函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名。 声明函数指针 声明指针时,必须指定...
  • 函数指针
  • 函数指针的强制类型转换与void指针

    万次阅读 2018-06-21 11:36:28
    驱动库的作者为了使DVB芯片兼容尽可能多的tuner芯片,在定义tuner_init函数指针时,参数中的handle定义为(void* handle)。这样的话,这个handle既可以接收tuner1_handle ,也可以接收tuner2_handle。同时函数指针...
  • 函数指针和指针函数

    千次阅读 2018-09-25 22:14:37
    函数指针 ...函数指针只能指向具有特定特征的函数,要求所有被同一指针所指向的函数必须具有相同的参数和返回值类型 C语言标准的规定是函数指示符(即函数名)既不是左值也不是右值,但是CPP语言规定函...
  • 详解函数指针和类成员函数指针

    千次阅读 2017-11-12 21:35:56
    我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比从计算机原理的角度来理解更容易了。这里就简要回顾一下相关知识。 众所周知,计算机(图灵机)执行程序的基本流程就是:取指令->执行...
  • 就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。 我先给你一个自定义数据类型的例子。 typedef int* PINT; //为int* 类型定义了一个PINT的别名 int main() {  ...
  • 函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。很多c++泛型算法以及linux...
  • 函数指针(指向函数的指针) 与数据项类似,函数也有自己的地址。函数的地址是存储其机器代码的内存的开始地址。例如,可以编写将另一个函数的地址作为参数的函数,这样第一个函数将能够找到第二个函数,并运行它。...
  • 就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。 我先给你一个自定义数据类型的例子。 typedef int* PINT; //为int* 类型定义了一个PINT的别名 int main
  • 使用 typedef 定义函数指针,更优雅的使用函数指针

    万次阅读 多人点赞 2018-08-24 09:23:56
    关于函数指针的介绍,这里就不做过多说明了,不了解的同学可以看看这篇博客: https://blog.csdn.net/afei__/article/details/80549202   使用 typedef 定义函数指针 通过下面这个例子,我们看看 typedef 是...
  • 问一:函数有类型吗? 答:有,举两个例子即可明白...答:个人认为函数名同数组名一样都是个常量,表示函数体的首地址,并不是完全意义上的函数指针。 问三:函数的强制类型转换 答:可以看如下代码: void fu
  • 函数指针函数指针数组,函数指针数组的指针

    千次阅读 多人点赞 2017-11-27 11:39:51
    数组指针 概念:数组指针指针,只要是指针他就占4个字节; 例如: 整形指针:int *p;能够指向整形数据的指针  浮点型指针:float *p;能够指向浮点型的数据的指针 那么数组指针,同样的理解就是指向数组的指针...
  • 函数指针(function pointer)是通过指向函数的指针间接调用函数。相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生。...和其他指针一样,函数指针指向某种特定类型,所有被
  • 【C++札记】指针函数与函数指针

    千次阅读 2017-11-22 10:41:48
    指针函数是一个函数,只不过指针函数返回的类型是某一类型指针。 格式: 类型名*函数名(函数参数列表) 如下代码存在问题 void test(char *p) { p = (char*)malloc(10); return; } int main() { char* ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 868,776
精华内容 347,510
关键字:

不同类型函数指针