doclist 阅读(27) 评论(0)

 

1、指向函数的指针

可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数中的入口地址就称为函数的指针。

例:比较a和b的大小,求大值。

#include<stdio.h>
#include "StdAfx.h"
int max(int x,int y)
{
    int z;
    if(x>y)
    {
        z=x;
    }
    else
    {
        z=y;
    }
    return z;
}
void main()
{
    int max(int,int);
    int (*p)(int,int);
    int a,b,c;
    p = max;
    scanf("%d%d",&a,&b);
    c=(*p)(a,b);
    printf("a=%d,b=%d,max=%d",a,b,c);

}

用指向函数的指针作函数参数

函数指针变量常用的用途之一是指针作为参数传递到其他函数,以实现函数地址的传递,这样就能在被调用的函数中使用实参函数。

例:

#include<stdio.h>
#include "StdAfx.h"

void sub(int(*x1)(int),int(*x2)(int,int))/**x1与*x2分别为两个函数f1,f2的地址*/
{
    int a,b,i,j;
    a=(*x1)(i);    /*调用f1函数*/
    b=(*x2)(i,j);/*调用f2函数*/
    ……
}

返回指针值的函数

一般形式为*函数名 (参数表列);

例:有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号后,能输出该学生的全部成绩,用指针函数实现。

#include<stdio.h>
#include "StdAfx.h"

void main()
{
    double score[][4]={{65,45,12,78},{45,45,88,65},{65,78,98,46},{78,45,96,93}};
    double *search(double(*pointer)[4],int n);
    double *p;
    int i,n;
    scanf("%d",&n);
    printf("The scores of No.%d are:\n",n);
    p=search(score,n);
    for(i=0;i<4;i++)
    {
        printf("%5f\t",*(p+i));
    }
    printf("\n");
}
double *search(double(*pointer)[4],int n)
{
    double *pt;
    pt=*(pointer+n);
    return pt;
}

指针函数与函数指针的区别:

指针函数时指带指针的函数,即本质是一个函数。

函数指针是指函数的指针变量,因而函数指针本身首先应是指针变量,该指针变量指向函数。

指针数组和指向指针的指针

指针数组:一个数组,若元素均为指针类型数据,称为指针数组。

一维指针数组定义形式:类型名 *数组名[数组长度];

例:int *name[4];

例:

#include<stdio.h>
#include "StdAfx.h"

void main()
{
    int a[5]={1,2,3,4,5};
    int *name[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
    int i;
    for(i=0;i<5;i++)
    {
        printf("%d",*name[i]);

    }
}

指向指针的指针

形式:char **p;

说明:p前面有两个‘*‘号,*运算符的结合性是从右到左,因此**p相当于*(*p),显然*p是指针变量的定义形式。

例:

#include<stdio.h>
#include "StdAfx.h"

void main()
{
    char *name[]={"I love China","NIT","I love you"};
    char **p;
    int i;
    for(i=0;i<3;i++)
    {
        p=name+i;
        printf("%s\n",*p);
    }
}