黑马程序员——c语言基础:指针函数和函数指针

1.指针函数

 指针函数:返回值是指针的函数。

 指针函数的定义:

    指针函数类型 *函数名(){

        return 地址;

    }


实例1:用指针函数输出两个数中大数的地址。

#include <stdio.h>


int *bigAdress(int *a, int *b){

    return *a > *b ? a : b;

}


int main(int argc, const char * argv[]) {

    // 定义并初始化两变量

    int a = 23;

    int b = 89;

    

    // 输出ab的地址

    printf("&a = %p\n&b = %p\n",&a,&b);

    

    // 用指针函数找出大数的地址并输出

    printf("大数地址为:\n%p", bigAdress(&a,&b));

    return 0;

}


实例2:通过指针函数,输入一个1~7之间的整数,输出对应的星期名。

#include <stdio.h>


char *printDay(int n){

    // 定义一个字符串指针数组

    char *week[7] = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};

    return n > 0 && n < 8 ? week[n - 1] : "输入错误!";

}

int main(int argc, const char * argv[]) {

    // 根据输入的整数输出对应星期名

    printf("%s", printDay(7));

    return 0;

}


实例3:用指针变量作为函数的参数,求出10个数的最大值。

#include <stdio.h>


/**

 *  找出数组中的最大值

 *

 *  @param a   传入的数组

 *  @param len 数组长度

 *

 *  @return 最大值

 */

int max(int *a, int len){

    // 定义变量储存最大值

    int max = *a; // 初始化为数组首元素

    // 找出最大值

    for (int i = 1; i < len; i ++) {

        if (*(a +i) > max) {

            max = *(a + i);

        }

    }

    return max;

}

int main(int argc, const char * argv[]) {

    // 定义并初始化一个数组

    int a[10] = {12,23,34,13,999,4,0,-45,9,10};

    

    // 调用函数找出最大值

    int m = max(a, 10);

    

    // 输出最大值

    printf("%d", m);

    return 0;

}



2.函数指针

 函数指针变量:存放函数的首地址的指针变量就是函数指针变量。

 函数指针变量的定义

    返回值类型 (*变量名)(函数的参数);

    int (*p)(int a, int b); // 定义了一个函数指针p,可以存放返回值为int类型,并且有两个int类型的形参的函数

    int (*p1)(int ,int ); // 定义函数指针的时候,可以不用写形参名

 函数指针的初始化

    p = sum; // sum是函数名,存的就是函数在内存中的首地址

 函数指针的使用

    1)定义函数指针

    2)给函数指针初始化

    3)用函数指针间接调用函数

 注意:

    1)函数指针变量不能进行算术运算

    2)函数调用中“(*指针变量名)”的括号不可少


函数指针的使用举例

#include <stdio.h>


// 定义函数

int sum(int a, int b){

    return a + b;

}

int main(int argc, const char * argv[]) {

    // 定义函数指针

    int (*p)(int ,int );

    

    // 给函数指针初始化

    p = sum;

    

    // 用函数指针间接调用函数

    int s = p(23,89); // 也可以写成(*p)(23,89);

    printf("%d", s);

    return 0;

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值