c语言tips-函数指针和指针函数

0.写在最前

最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路

1. 函数指针

1.1 解释

一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。

1.2 定义形式

returnType (*pointerName)(param list);

  • returnType 是returnType 为函数返回值类型
  • pointerName 为指针名称
  • param list 为函数参数列

注意:

  • 参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。

  • ( )的优先级高于*,第一个括号不能省略,如果写作returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为returnType *

1.3 使用举例

#include <stdio.h>

int sum(int a, int b)
{
    return a + b;
}

int main(void)
{
    // 打印sum的值
    printf("sum的值为:%p\n", sum);
    int (*p)(int, int) = sum;
    // 使用函数指针进行调用
    int sum = (*p)(1,2);
    printf("函数返回值为:%d", sum);
    return 0;
}

可以看到函数名的值是一个地址,那既然指针所存储的也是一个地址,当然可以将函数名赋值给指针,然后指针进行调用,这就是函数指针,函数值可以和函数名一样对函数进行调用然后得到返回值

2. 指针函数

2.1 解释

指针函数那就比较常见了,函数都有返回值,当返回值是一个指针时这个函数就被称为指针函数

2.2 定义形式

returnType *pointerName(param list);
其实就比函数指针少了一个括号

2.3 例子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* longer_str(char *a, char *b)
{
    return strlen(a) > strlen(b) ? a : b;
}

int main()
{
    char* a = "aaaaaaaaa";
    char* b = "bbbbbbb";
    char* c = longer_str(a, b);
    puts(c);
}
#include <stdio.h>


int *max_num(int *a, int *b) {
    return *a > *b ? a : b;
}

int main() {
    int a = 200;
    int b = 100;
    int *max_point = max_num(&a, &b);
    printf("%d", *max_point);
}

3. 一些长相奇特的指针函数和函数指针

char *a ( char *b, void (*c) (int) );

一个指针函数 a,它的返回一个字符串,它有两个参数 b 和 c,其中 b 是一个字符串,c 是一个指向参数为 int 类型,返回值为 void 类型的函数指针

void ( *func ( int, void (*) (int) ) ) (int)

func 是一个返回值为函数指针(指向一个参数为 int 类型,返回值为 void 类型的函数)的函数,func 有两个参数,第一个参数是 int 类型,第二个参数为函数指针(指向一个参数为 int 类型,返回值为 void 类型的函数)

char *(* c[10])(int **p);

c 是一个拥有 10 个元素的指针数组,每个指针指向一个原型为 char *func(int **p);的函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值