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

函数指针和指针函数以及函数指针数组

阅读更多
1、指针函数:

指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示: 

返回类型标识符 *返回名称(形式参数表) 

{ 函数体 } 

返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子:

例一、

#include<stdio.h>

float *find(float(*pionter)[4],int n)/*定义指针函数*/ 

{ 

    float *pt; 

    pt=*(pionter+n); 

    return(pt); 

}

void main() 

{ 

    static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}}; 

    float *p; 

    int i,m; 

    printf("Enter the number to be found:"); 

    scanf("%d",&m); 

    printf("the score of NO.%d are:\n",m); 

    p=find(score,m); 

    for(i=0;i<4;i++) 

        printf("%5.2f\t",*(p+i)); 

}

学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score数组的首地址传给pointer.

例二、将字符串1(str1)复制到字符串2(str2),并输出字符串2

#include <stdio.h>

#include<stdlib.h>

char * mystrcpy(char * str1,char * str2)

{

    char * pr;

    pr=str2;

    if(*str2==NULL)

    exit(-1);

    while(*str1!=NULL)

    { 

*str2++=*str1++;

}

    return pr;

}

void main()

{

char str1[]="I LOVE SHY";

char str2[]="awenandy";

char *p;

p=mystrcpy(str1,str2);

printf("%s\n",p);

}

例三、

#include<stdio.h>

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,0}

            };

            return (&calendar[wk-1][dy-1]);

        }

   void 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",*GetDate(wk,dy));

        }

2 函数指针

“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为: 

函数类型 (*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定义函数指针时请注意:

    

函数指针和它指向的函数的参数个数和类型都应该是—致的;

函数指针的类型和函数的返回值类型也必须是一致的。

函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

例如,

int func(int x);   /* 声明一个函数 */

int (*f) (int x);    /* 声明一个函数指针 */

f=func;            /* 将func函数的首地址赋给指针f */

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。

由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:

首先,要说明函数指针变量。

例如:int (*f)(int x);

其次,要对函数指针变量赋值。

例如: f=func;    (func(x)必须先要有定义)

最后,要用 (*指针变量)(参数表);调用函数。

例如:    (*f)(x);(x必须先赋值)

例一、

#include<stdio.h>

int max(int x,int y)

{ return(x>y?x:y);

}

void main()

{

    int a,b,c;

     int (*ptr)(int,int);

    scanf("%d,%d",&a,&b);

     ptr=max;

    c=(*ptr)(a,b);

    printf("a=%d,b=%d,max=%d",a,b,c);

    

}

例二、

#include<stdio.h>

void FileFunc()

        {

            printf("FileFunc\n");

        }

        void EditFunc()

        {

            printf("EditFunc\n");

        }

        void main()

        {

            void (*funcp)();

            funcp=FileFunc;

            (*funcp)();

            funcp=EditFunc;

            (*funcp)();

        }

ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。

关于函数指针数组的定义

关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。

第一种,标准方法:

{ 

分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。 

根据分析:首先说明是一个数组:数组名[] 

其次,要说明其元素的数据类型指针:*数组名[]. 

再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。

}

第二种,蒙骗法:

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。

函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。 

那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。

完整例子:

#include "stdio.h"

int add1(int a1,int b1);

int add2(int a2,int b2);

void main()

{

int numa1=1,numb1=2;

int numa2=2,numb2=3;

int (*op[2])(int a,int b);

op[0]=add1;

op[1]=add2;

printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));

}

int add1(int a1,int b1)

{

return a1+b1;

}

int add2(int a2,int b2)

{

return a2+b2;

}

再给出常用的C变量的定义方式:

a) 一个整型数(An integer) 

b) 一个指向整型数的指针(A pointer to an integer) 

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) 

d) 一个有10个整型数的数组(An array of 10 integers) 

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) 

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) 

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) 

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an

integer )

答案是: 

a) int a; // An integer 

b) int *a; // A pointer to an integer 

c) int **a; // A pointer to a pointer to an integer 

d) int a[10]; // An array of 10 integers 

e) int *a[10]; // An array of 10 pointers to integers 

f) int (*a)[10]; // A pointer to an array of 10 integers 

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer 

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
分享到:
评论

相关推荐

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

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

    函数指针与函数指针数组,多层

    在这个例子中,我们看到如何使用函数指针以及多层函数指针数组。 首先,`Drive`函数接受三个参数:目标距离`_distance`、现有燃油`hasoil`和一个名为`engine`的函数指针。函数指针`engine`指向一个接受整型燃油`oil...

    指针进阶之函数指针和函数指针数组

    函数指针和函数指针数组 函数指针是一种特殊的指针,它是指向函数的指针。函数指针可以用来存放函数的地址,并且可以通过函数指针来调用函数。 1. 简单介绍 函数指针是指向函数的指针,它可以用来存放函数的地址...

    彻底了解指针数组,数组指针以及函数指针

    ### 彻底了解指针数组、数组指针以及函数指针 #### 一、指针与内存分配...通过上述介绍,我们可以看到指针数组、数组指针以及函数指针在C语言中的重要性和灵活性。熟练掌握这些概念对于编写高效、灵活的代码至关重要。

    指针, 指针的指针, 数组, 指针数组, 数组指针, 指针函数, 函数指针 CC++中函数指针的含义

    9. **typedef 和函数指针**: `typedef` 关键字可以用来定义新的类型别名,使得函数指针的定义更加简洁。例如,`typedef int (*fp)(int a);` 定义了一个名为 `fp` 的类型,代表了接受一个整数参数并返回整数的函数...

    c++函数数组指针的使用方法

    本文将详细介绍如何在C++中使用函数指针以及函数数组指针,特别是如何通过这些技术来减少代码量、提高代码的复用性和可读性。 #### 函数指针基础 函数指针是指向函数的指针变量。它们可以存储函数的地址,并且可以...

    多线程函数指针数组.rar

    函数指针本质上是一个指向函数的指针变量,可以像操作普通数据一样操作它,包括赋值、传递和调用。在多线程环境中,函数指针常用于创建线程时指定线程的入口点,即线程开始执行的函数。通过函数指针数组,我们可以...

    函数指针数组

    接下来是一个更复杂的示例,涉及到多级指针以及函数指针数组的使用: ```cpp char*(*(*pf)[3])(char *p); ``` 这段代码定义了一个多层嵌套的指针类型`pf`。这里`pf`是一个指向一个包含三个元素的数组的指针,每个...

    C语言指针数组函数笔记

    "C语言指针数组函数笔记" ...本笔记总结了C语言中的指针和数组相关知识点,涵盖了变量、指针变量、指针运算符、数组和指针数组函数等内容。通过阅读本笔记,读者可以更好地理解和应用C语言中的指针和数组。

    函数指针数组的妙用

    在此基础上,我们可以创建函数指针数组,即一个数组中存储多个函数指针,这些函数具有相同的参数列表和返回类型。函数指针数组能够根据不同的条件或需求,动态地选择调用不同的函数,极大地提高了代码的灵活性和效率...

    函数指针数组示例

    C语言中对函数指针数组不是很了解,老师最近布置了一个作业,就搜集资料写了一个,希望能给大家启发,如果对C语言复杂指针的分析不是很懂得话,可以网上搜索“右左法则”

    【C语言指针】深入浅出:指针与取值、数组、函数; 详细剖析:指针函数、函数指针、指针数组、数组指针、双重指针、指针与动态内存分配

    详细剖析:指针函数、函数指针、指针数组、数组指针、双重指针、指针与动态内存分配 个人总结要点: 本质: 地址要用指针来存储,指针是用来存储地址的!!! 重难点: 指针指向的地址,也就是指针存储的地址!!...

    自己整理的经典程序,数组,指针,函数那是相当有用

    自己整理的经典程序,数组,指针,函数那是相当有用

    数组指针,函数指针应用

    在C/C++编程语言中,数组和指针是两个核心概念,它们的结合以及与函数指针的交互能实现强大的功能。本主题将深入探讨数组指针和函数指针的应用,通过提供的源代码实例,我们可以更好地理解这两种概念的实用性和灵活...

    C++指针——数组指针/函数指针

    本篇文章将深入探讨两种特殊的指针类型:数组指针和函数指针。这两种类型的指针在处理数据集合和调用函数时具有显著的优势。 首先,让我们了解数组指针。在C++中,数组本质上是一系列相同类型的数据元素的连续存储...

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

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

    数组与指针区别(很全面)

    本文旨在澄清关于数组名是否等同于指针这一常见的误区,并通过具体的代码示例来深入探讨数组和指针之间的关系及其差异。 #### 二、数组与指针的基本概念 1. **数组**: - 数组是一系列相同类型的数据项的集合。 ...

    函数指针和函数指针数组的使用

    函数指针和函数指针数组的使用 函数指针和函数指针数组是C语言程序设计中的一种重要概念,它们可以解决实际程序编写过程中的多种情况问题。在本文中,我们将介绍函数指针和函数指针数组的概念、定义、使用方法,并...

    C语言中指针、数组和函数的综合应用与实例解析.pdf

    C语言中指针、数组和函数的综合应用与实例解析 本文对C语言中指针、数组和函数的概念、运算和应用进行了详细的探讨和分析。指针是C语言的重要特色,是一种特殊的数据类型,通过存储空间的地址或编号来访问数据。...

    指针函数和函数指针变量

    函数指针的声明需要包括函数的返回类型、参数列表以及函数名前的星号。例如: ```c void print_message(char *); void (*func_ptr)(char *) = print_message; // 声明并初始化一个函数指针变量 func_ptr("Hello"); ...

Global site tag (gtag.js) - Google Analytics