精华内容
下载资源
问答
  • C语言指针函数和函数指针详细介绍.
  • 往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面详细为大家介绍C语言指针函数和函数指针。
  • C语言指针函数和函数指针详细介绍 浏览:4830 | 更新:2013-05-07 15:51 | 标签:c语言  往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面就由南宁达内小编详细为大家...

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

    • 浏览:4830
    • |
    • 更新:2013-05-07 15:51
    • |
    • 标签:c语言 

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面就由南宁达内小编详细为大家介绍C语言中指针函数和函数指针。

    1. 一、指针函数

       当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。

      格式:

      类型说明符 * 函数名(参数)

      当然了,由于返回的是一个地址,所以类型说明符一般都是int。

      例如:

      int *GetDate();  int * aaa(int,int);

      函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。

      int * GetDate(int wk,int dy);  main()

      {  int wk,dy;

      do {  printf("Enter week(1-5)day(1-7)\n");  scanf("%d%d",&wk,&dy);

      }  while(wk<1||wk>5||dy<1||dy>7);

      printf("%d\n",*GetDate(wk,dy));  }

      int * GetDate(int wk,int dy)  {

      static int calendar[5][7]=  {

      {1,2,3,4,5,6,7},  {8,9,10,11,12,13,14},

      {15,16,17,18,19,20,21},  {22,23,24,25,26,27,28},

      {29,30,31,-1}  };

      return &calendar[wk-1][dy-1];  }

      程序应该是很好理解的,子函数返回的是数组某元素的地址。输出的是这个地址里的值。

    2. 二、函数指针

      指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:

      类型说明符 (*函数名)(参数)

      其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。

      指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。

      例如:

      void (*fptr)();

      把函数的地址赋值给函数指针,可以采用下面两种形式:

      fptr=&Function;  fptr=Function;

      取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数:

      x=(*fptr)();  x=fptr();

      第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:

      void (*funcp)();  void FileFunc(),EditFunc();

      main()  {

      funcp=FileFunc;  (*funcp)();

      funcp=EditFunc;  (*funcp)();

      }  void FileFunc()

      {   printf("FileFunc\n");

      }  void EditFunc()

      {  printf("EditFunc\n");  }

      程序输出为:

      FileFunc  EditFunc

    3. 三、指针的指针

       指针的指针看上去有些令人费解。它们的声明有两个星号。例如:

      char ** cp;

       如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到二级指针,三个星号不常见,更别说四个星号了。

      指针的指针需要用到指针的地址。

      char c='A';  char *p=&c;  char **cp=&p;

       通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。

      下面就是几个这样的例子:

      char *p1=*cp;  char c1=**cp;

       你可能想知道这样的结构有什么用。利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组。

      void FindCredit(int **);  main()

      {  int vals[]={7,6,5,-4,3,2,1,0};

      int *fp=vals;  FindCredit(&fp);

      printf("%d\n",*fp);  }

      void FindCredit(int ** fpp)  {

      while(**fpp!=0)  if(**fpp<0) break;

      else (*fpp)++;  }

       首先用一个数组的地址初始化指针fp,然后把该指针的地址作为实参传递给函数FindCredit()。FindCredit()函数通过表达式**fpp间接地得到数组中的数据。为遍历数组以找到一个负值,FindCredit()函数进行自增运算的对象是调用者的指向数组的指针,而不是它自己的指向调用者指针的指针。语句(*fpp)++就是对形参指针指向的指针进行自增运算的。但是因为*运算符高于++运算符,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。

    4. 四、指向指针数组的指针

       指针的指针另一用法旧处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。

      char *Names[]=  {

      "Bill",  "Sam",

      "Jim",  "Paul",

      "Charles",  0

      };  

      main()  {  char **nm=Names;  while(*nm!=0) printf("%s\n",*nm++);

      }

       先用字符型指针数组Names的地址来初始化指针nm。每次printf()的调用都首先传递指针nm指向的字符型指针,然后对nm进行自增运算使其指向数组的下一个元素(还是指针)。注意完成上述认为的语法为*nm++,它首先取得指针指向的内容,然后使指针自增。

    展开全文
  • C语言指针函数和函数指针区别

    千次阅读 多人点赞 2019-02-28 15:24:46
    C语言函数指针和指针函数的区别 C和C++中经常会用到指针,和数据项一样,函数也是有地址的,函数的地址是存储其机器语言代码的内存的开始地址。 指针函数和函数指针经常会混淆,一个是返回指针的函数,另一个是指向...

    C语言函数指针和指针函数的区别

    C和C++中经常会用到指针,和数据项一样,函数也是有地址的,函数的地址是存储其机器语言代码的内存的开始地址。

    指针函数和函数指针经常会混淆,一个是返回指针的函数,另一个是指向函数的指针,下面就分别解释指针函数和函数指针的区别。

    一、指针函数

    指针函数是 返回指针的函数 主体是函数,返回值是一个指针
    基本声明形式:返回数据类型 + * + 函数名 + (变量类型1,…);
    e.g :

    int* fun(int,int);  
    int * fun(int,int);
    int *fun(int,int);
    

    这三种声明都可以,第一种更加直观 返回值是 int* 类型

    举个栗子:

    #include<stdio.h>
    int* fun(int* x)    //传入指针  
    {
    	int* tmp = x;	  //指针tmp指向x
        return tmp;       //返回tmp指向的地址
    }
    int main()
    {
        int b = 2;      
        int* p = &b;   //p指向b的地址
        printf("%d",*fun(p));//输出p指向的地址的值
        return 0;
    }
    

    输出结果:2

    二、函数指针

    函数指针是 指向函数的指针 主体是指针 指向的是一个函数的地址
    基本声明形式:返回数据类型 + (*函数名) + (变量类型1,…);
    注意 * 和函数名要用括号括起来,否则因为运算符的优先级原因就变成指针函数了
    e.g:

    int (*fun) (int);
    
    #include<stdio.h>
    int add(int x,int y)
    {
        return x + y;
    }
    int (*fun) (int,int);			//声明函数指针
    int main()
    {
        fun = &add;					//fun函数指针指向add函数
        printf("%d ",fun(3,5));		
        printf("%d",(*fun)(4,2));
        return 0;
    }
    

    输出结果:8 6
    上面的样例中,使用函数指针时使用fun(3,5)(*fun)(3,5)都可以

    函数指针的参数列表要和函数指针指向的函数的参数列表一致

    主要记住指针函数是返回指针的函数而函数指针是指向函数的指针
    在这个基础上可以有函数指针函数和指针函数指针之类的
    指针函数声明的时候 * 和函数名不需要括号括起来
    函数指针声明的时候 * 需要和函数名用括号括起来(优先级原因)

    展开全文
  • 详解C语言指针函数、函数指针、函数指针数组

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

    在C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是一个必须的过程。而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。

    1. 指针函数

    指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。

    声明形式:type *func (参数列表)

    #include <iostream>
    using namespace std;
    
    
    int *GetNum(int x); //指针函数声明形式
    
    
    void main(void)
    {
        cout << "===============start================" << endl;
        int num;
        cout << "Please enter the number between 0 and 6: ";
        cin >> num;
        cout << "result is:" << *GetNum(num) << endl;    //输出返回地址块中的值
        system("pause");
    }
    
    int *GetNum(int x) {
        static int num[] = { 0,1,2,3,4,5,6 };
        return &num[x];  //返回一个地址
    }
    

    2. 函数指针

    函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。

    声明形式:type (*func)(参数列表 )

    从上面的定义形式可以看出,函数指针和指针函数的直观上区别在于指针符号*与函数名/指针名有没有用括号()包裹起来,从这一点来看是很容易区分两者的。

    #include <iostream>
    using namespace std;
    
    int max(int a, int b) {
        return a>b ? a : b;
    }
    
    void main(void)
    {
        cout << "===========start===========" << endl;
        int(*func)(int, int);       //定义一个指向该函数形式的指针变量
        func = max;
        int a, b;
        cout << "Please enter two numbers:";
        cin >> a >> b;
        cout << "max=" << (*func)(a, b) << endl;    //运用指针变量调用函数
        cout << "max=" << max(a, b) << endl;        //使用原函数调用
        cout << "max=" << func(a, b) << endl;       //使用函数指针名调用,func = max
        system("pause");
    }
    

    上例给出了函数指针的两种最普遍的调用形式,一个是直接用定义的指针变量(* func)调用,一个是用指针名调用,后者看起来就像是将原函数使用了新名称去调用一样,可以看成函数的别名。再次强调一下:指针变量名和指针符号 * 一定要用括号包裹起来。函数指针还有一种常用的使用方式,就是使用typedef定义后再使用。将上例稍作修改如下:

    #include <iostream>
    using namespace std;
    
    int max(int a, int b) {
        return a>b ? a : b;
    }
    
    typedef int(*func)(int, int);
    
    void main(void)
    {
        cout << "===========start===========" << endl;
        func maxfunc = max;
        int a, b;
        cout << "Please enter two numbers:";
        cin >> a >> b;
        cout << "max=" << (*maxfunc)(a, b) << endl; //运用指针变量调用函数
        cout << "max=" << max(a, b) << endl;        //使用原函数调用
        cout << "max=" << maxfunc(a, b) << endl;        //使用函数指针名调用,func = max
        system("pause");
    }
    

    3. 函数指针数组

    顾名思义,就是每个元素都是函数指针的数组,直接在函数指针名后面加上数组符号[ ]即可。

    声明形式:type (*func[ ])(参数列表 )

    #include<iostream>
    using namespace std;
    
    void fun1()
    {
        cout << "调用函数fun1" << endl;
    }
    void fun2()
    {
        cout << "调用函数fun2" << endl;
    }
    void fun3()
    {
        cout << "调用函数fun3" << endl;
    }
    int main()
    {
        //定义三个函数指针
        void(*pfun)() = &fun1;
        void(*pfun2)() = &fun2;
        void(*pfun3)() = &fun3;
        //接下来就是定义一个数组把他们三个装进去。
        void(*pfunarr[3])();
        void(*pfunarr[3])();
        pfunarr[0] = pfun;
        pfunarr[1] = pfun2;
        pfunarr[2] = pfun3;
        /*  或者这样赋值
        pfunarr[0] = &fun1;
        pfunarr[1] = &fun2;
        pfunarr[2] = &fun3;
        */
        //调用运行
        pfunarr[0]();
        pfunarr[1]();
        pfunarr[2]();
        /*  或者这样调用
        (*pfunarr[0])();
        (*pfunarr[1])();
        (*pfunarr[2])();
        */
        system("pause");
        return 0;
    }
    

    4. C语言函数不可以定义为数组,只能通过函数指针来操作定义函数指针数组。

    5. 指向函数指针数组的指针

    声明形式:type (* (*func )[ ])(参数列表 )

    #include<iostream>
    using namespace std;
    
    void fun1()
    {
        cout << "调用函数fun1" << endl;
    }
    void fun2()
    {
        cout << "调用函数fun2" << endl;
    }
    void fun3()
    {
        cout << "调用函数fun3" << endl;
    }
    int main()
    {
    
        //void(*pfun)() = &fun1;
        //void(*pfun2)() = &fun2;
        //void(*pfun3)() = &fun3;
        //接下来就是定义一个数组把他们三个装进去。
        void(*pfunarr[3])();
        void(*(*pfunarr2)[3])();
        //在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
        pfunarr[0] = &fun1;
        pfunarr[1] = &fun2;
        pfunarr[2] = &fun3;
    
        pfunarr2 = &pfunarr;
        (*pfunarr2)[0]();
        pfunarr[0]();
        system("pause");
        return 0;
    }
    

    分析其定义形式:void(*(*pfunarr2)[3])()
    其中(* pfunarr2)[3]表示数组指针,而void(* )( )表示函数指针,两者结合起来就是指向函数指针数组的指针。

    展开全文
  • 指针函数 1.指针函数是指带指针的函数,即本质是一个函数。函数的返回类型是一种类型的指针。比如: int *fun(int a,int b) { } 它是一个指针函数,函数的返回类型是一个int型的指针。 #include<stdio.h&...

    一、.指针函数

    1.指针函数是指带指针的函数,即本质是一个函数。函数的返回类型是一种类型的指针。比如:

    int *fun(int a,int b)
    {
            
    }

    它是一个指针函数,函数的返回类型是一个int型的指针。

    #include<stdio.h>
    #include<Windows.h>
    int *fun(int x,int y)
    {
    	return x>y?&x:&y;//返回大的数的地址
    }
    int main()
    {
    	int a,b,*p;
    	scanf("%d %d",&a,&b);
    	p=fun(a,b);//用一个int型的指针来接收fun函数的返回值,一个地址
    	printf("the max is:%d\n",*p);//通过返回的地址输出大的数
    	system("pause");
    	return 0;
    }

    二、函数指针

    1.函数指针是指向函数的指针变量,即本质是一个指针变量。比如,定义一个函数指针:

    int (*p)(int x,int y);
    #include<stdio.h>
    #include<Windows.h>
    int func(int x,int y)
    {
    	return x>y?x:y;
    }
    int main()
    {
    	int a,b;
    	int (*p)(int x,int y);//定义函数指针,该指针指向一个int型且具有两个参数的函数
    	p=func;//将该函数的地址赋给指针p
    	scanf("%d %d",&a,&b);
    	printf("the max is :%d\n",(*p)(a,b));//用括号整体把*p括起来调用函数并输出
    	system("pause");
    	return 0;
    }

    展开全文
  • C语言指针函数的使用

    2019-07-03 08:43:52
    程序中子函数fun(int *k)的作用是给静态全局变量加上形参*k的值。 第一次for循环执行时,fun(&a[2])的返回值为5,所以5+5=10,因而输出结果为10, 第二次for循环执行时,fun(&a[3])的返回值为14,所以14+14=...
  • 我们大家都知道指针函数的返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象...
  • C语言函数指针和指针函数在学习C语言的过程中,“指针函数”和“函数指针”经常容易搞混了, 最简单的辨别方式就是看函数名前边的指针*星号是有没有被()包含,如果被包含了就是函数指针,反之则是指针函数。定义指针...
  • C语言指针指针函数参数.cpp
  • C语言】函数指针与指针函数 最近在阅读cJSON的源代码,在看见如下代码是产生了,深深地疑惑,这个是什么声明?用来干嘛的? void *(*malloc_fn)(size_t sz); void (*free_fn)(void *ptr); 在读懂这两句代码之前...
  • c语言指针作为函数的参数

    万次阅读 多人点赞 2018-07-09 22:00:43
    c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。 #include &lt;stdio.h&...
  • c语言之函数指针及指针函数

    千次阅读 2018-11-14 17:41:04
    用最少的字来阐述函数指针与指针函数之间的本质区别及用法。使用过程中,万变不离其宗,只会在返回的类型,参数类型上做文章,本质不便。 概念: 指针函数本质是一个函数,只是函数的返回值是一个指针。 函数指针...
  • C语言中指针为内存地址,可以指向变量...定义函数时需要说明函数的返回值类型,其可以是整型,字符型或者是指针等,当函数的返回值为指针时,该函数就称为指针函数指针函数返回的是指针,及一个地址,其定义方式为:
  • 在大家刚开始学习c语言的时候,总是分不清函数指针和指针函数,就算是知道了它们之间的区别,也不了解它们的使用场景, 我写此博客帮大家缕一缕,也帮我自己缕一缕 1、函数指针与指针函数的概念以及区别 指针函数...
  • 函数指针和指针函数的区别 函数指针和指针函数的区别 首先我们普及下概念: 函数类型:函数返回值的类型; 在C语言中,函数可以返回除数组和函数外的任何类型数据和指向任何类型的指针。返回指针的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,374
精华内容 8,949
关键字:

c语言指针函数

c语言 订阅