指针函数和函数指针

简介: 指针函数和函数指针

引言

在C语言中有很多这样神奇的存在,正着读和反着读都有意义,比方说常量指针指针常量指针函数和函数指针又是什么呢?

这个要从语言学的角度去分析就很好理解哈,可以说是个偏正短语,由定语和中心词构成。

从上图就可以很容易地看出,指针函数,其实质上是一个函数 ,而函数指针,本质上是一个指针 。那么具体是什么样的函数和什么样的指针呢?

1.指针函数

指针函数,指的是返回值是指针的函数,有时候我们出于需要,某个函数的返回值会是一个指针,比方说:

#include <stdio.h>
int sum = 0;
int *add(int a, int b)
{
  sum = a + b;
  return &sum;
}
int main()
{
  int *p = add(2, 3);
  printf("%d\n", *p);
}

这就是常说的指针函数。但是为了保持该地址处的值不会改变,往往会进行这样的处理。

#include <stdio.h>
int sum = 0;
int *add(int a, int b)
{
  static int sum = 0;
  sum = a + b;
  return &sum;
}
int main()
{
  int *p = add(2, 3);
  printf("%d\n", *p);
}

也就是所谓的static关键字。这样做的意义,就在于,这样sum便处在数据段,也就是说,程序运行期间一直存在,并不像局部变量那样,保存在栈区,程序执行完之后就会将该部分内存回收。

2.函数指针

所谓的函数指针,就是指向函数的指针,比方下面的例子;

#include <stdio.h>
void func()
{
  printf("hello world in func!");
}
int main()
{
  void(*pfunc)();
  pfunc = func;
  pfunc();
}

代码很好理解,定义了函数指针pfunc指向了func,这个时候再执行,当然就会直接执行func。打印输出如下:

或者说,稍微复杂点,可以传参数,像下面这样;

#include <stdio.h>
void func(char a[], int len)
{
  printf("hello world in func!\n");
  for (int i = 0; i < len; i++)
  {
    printf("%c",a[i]);
  }
  printf("\n");
}
int main()
{
  void(*pfunc)();
  pfunc = func;
  pfunc("^-^",3);
}

打印输出:

当然,要想真正发挥函数指针的作用,当然是在回调函数中。函数指针的一个非常典型的应用就是回调函数,比如下面的例子:

#include <stdio.h>
//假设此处是冒泡排序的实现函数
void bubble_sort()
{
  printf("this is bubble sort function!\n");
}
//假设此处是选择排序的实现函数
void select_sort()
{
  printf("this is quick sort function!\n");
}
//假设此处是快速排序的实现函数
void quick_sort()
{
  printf("this is quick sort function!\n");
}
//这个函数就是回调函数
void data_handle(void (*pfunc)())
{
  pfunc();
}
int main()
{
  data_handle(quick_sort);
  data_handle(bubble_sort);
  data_handle(select_sort);
}

假设有这样一个应用场景,

我需要对某数据进行处理,处理之前要进行排序,但我目前并没有想好要采用哪种排序算法。

这个时候就可以采用回调函数来解决这个问题。

打印输出如下;

如果直接写会怎么样呢?

这个时候主函数是直接调用的data_handle(),然而每次排序算法的改变,都需要自己根据实际情况去在data_handle()调用不同的排序算法,这样对于真个程序的架构来说,显然是不够友好的,一般在大型程序开发中,底层的函数写好以后,是不允许随便修改的,这个时候回调函数就起到了很好的作用。

相关文章
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
211 1
|
6月前
|
存储 C语言
指针的函数传参的详细讲解(一)
本文介绍了计算机内存管理与C语言中指针的基本概念及应用。从内存单元的划分到指针的定义,解释了指针作为地址的作用及其数据类型特性。文章通过代码示例详细说明了一级指针、二级指针的使用方法,以及`void*`指针的特点和限制。此外,还探讨了指针运算规则、函数指针传参解引用的原理,并结合链表实例分析了一级与二级指针在实际场景中的区别。最后附带两道指针练习题,帮助读者巩固理解。
151 0
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
267 4
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
利用指针函数
【10月更文挑战第2天】利用指针函数。
99 1
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
161 2
|
程序员 C语言
指针在函数参数和返回值中的使用
指针在函数参数和返回值中的使用
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
魔法指针 之 函数指针 回调函数
魔法指针 之 函数指针 回调函数
107 0