指针学习记录(2)

8.5指向函数的指针

   定义一个指向函数的指针变量,用来存放某一函数的起始地址。例如

int (*p)(int,int);

定义p是一个指向整型函数的指针变量,且有两个整型参数是函数。p的类型用int(*)(int,int)表示。

 

8.5.2用函数指针变量调用函数

    调用函数指针的示例:

#include<stdio.h>
int main()
{
    int max(int, int);   //函数声明
    int(*p)(int, int);  //定义函数指针变量P
    int a=2, b=3, c;
    p = max;
    c = (*p)(a, b);   //调用函数指针
    printf("max is %d", c);
    return 0;
}
int max(int x, int y)
{
    int z;
    if (x > y) z = x;
    else z = y;

    return z;
}

  注意:(1)(*p)两边的括号不能少,表示p先于 * 结合,是指针变量 如果写成下面这种形式

int *p(int,int);  //这表示声明一个p(int ,int)函数了,这个函数的返回值为指向整型变量的指针;

(2)在程序中定义的函数指针只能指向定义时候,指定的类型的函数。一个指针变量可以指向同类型的不同函数;

(3)如果要用指针调用函数,必须先使指针变量指向该函数 如:p=max;

 

8.5.3用指向函数的指针做函数参数

  指向函数的指针可以作为函数的参数,把函数的入口地址传递给形参。

  举个简单例子,如下:

 

#include<stdio.h>
int main()
{
    int fun(int x, int y,int(*p)(int,int));  //fun函数声明
    int max(int, int);
    int min(int, int);
    int a = 34, b = -21, n;
    printf("请输入1或2,1代表最大,2代表最小\r\n");
    scanf("%d", &n);
    if (n == 1) fun(a, b, max);                //max作为实参传入
    else if (n == 2) fun(a, b, min);

    return 0;     
}

int fun(int x, int y, int(*p)(int, int)) 
{
    int result;
    result = (*p)(x, y);
    printf("%d\n", result);
}

int max(int x, int y)
{
    int z;
    if (x > y) z = x;
    else z = y;
    return z;
}

int min(int x, int y)
{
    int z;
    if (x < y) z = x;
    else z = y;
    return z;
}

当n=1时候,将max 函数入口地址传递给fun函数中的形参p。

当n=2时候,将min 函数入口地址传递给fun函数中的形参p。

 

8.6返回指针值的函数

 

 一个函数可以返回整型,字符型,也可以返回指针型的数据,即地址。例如int *a(int x,int y); 其中,a是函数名,调用以后得到int*型的指针。

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

#include<stdio.h>
int main()
{
    float score[][4] = { {60,70,80,90},{55,43,92,43,},{20,98,100,30} };//定义二维数组代表3个学生,4门成绩
    float* search(float(*pointer)[4], int n); //定义返回指针值的函数,第一个形参是数组指针,第二参数是学号
    float* p;
    int i, k;
    printf("请输入学生学号(1-3)"); 
    scanf("%d", &k);
    printf("该学生的学号是:%d\n", k); 

    p = search(score, k);
    for (i = 0; i < 4; i++)
    {
        printf("%5.2f\t", *(p + i));
        printf("\n");

    }

    return 0;
}
float* search(float(*pointer)[4], int n)
{
    float* pt;
    pt = *(pointer + n);
    return (pt);
}

 

  想要看明白这段代码,务必了解指针指向二维数组这一章节。*(pointer+n) 是指向第n行第0个元素的地址。即&score[k][0]; 至于后面输出的的*(p+i),实际就是   *(*(pointer+n)+i) ,代表第n行第i列的值 score[n][i]。

8.7指针数组

如果一个数组里面的元素全部为指针变量,则称为指针数组;

如 :int *p[4] 。[ ]优先级比*高,所以先结合成p[4],这是一个数组,然后再与*结合,表示这个数组是指针类型。

指针数组适合用来指向若干字符串,使字符串的处理更加灵活。

 

 请看例子:将若干字符串按字母顺序由小到大输出:

 

#include<stdio.h>
#include<string.h>
int main()
{
    void sort(char* name[], int n);
    void print(char* name[], int n);   //函数声明
    char *name[ ] = { "Follow me","Base","Hello world","Fly ","English" }; //定义指针数组,它的5个元素,分别指向5个字符串
    int n = 5;
    sort(name, 5);
    print(name, 5);

    return 0;
}

void sort(char* name[], int n)
{
    char* temp;
    int i, j, k;
    
    for (i = 0; i < n-1 ; i++)  //用选择法进行排序
    {
        k = i;
        for (j = i + 1; j < n; j++)
        {
            if(strcmp(name[k],name[j])>0)
                k = j;
        }
        if (k != i)
        {
            temp = name[k]; name[k] = name[j]; name[j] = temp;
        }

    }


}
void print(char* name[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%s\n", name[i]);

    }
}

  strcmp() 函数用于字符串比较,如果name[k]所指的字符串大于name[j]则此函数为正值。

 

 8.7.3指针数组作为 main函数的形参

有些时候,main函数可以有形参 如

int main(int argc,char*argv[]);

第一个参数argc,意思是命令行中参数个数,第二个参数argv 是一个指针数组,数组中的每个元素指向命令行中的一个字符串

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-03-13 14:01  雨落城  阅读(63)  评论(0)    收藏  举报