首页 > 其他分享 >【C语言中的函数指针】

【C语言中的函数指针】

时间:2024-09-25 09:50:29浏览次数:10  
标签:fp funcp int void C语言 char foreach 函数指针

C语言中的函数指针

首先搞一个循环输出字符串数组的功能

代码如下:

/* filename: funcp.c */
#include <stdio.h>

/* compile : gcc funcp.c -o funcp
       run : ./funcp               */

/**/
int
main (int argc, char *argv[])
{
  char *buff[5] = { "Jim", "Pike", "Tala", "Nor", "Alan" };
  for (int i = 0; i < 5; i++)
    printf ("Name %d : [%s]\n", i + 1, buff[i]);
  return 0;
}
/* --(:O\^/O:)-- */

编译运行,结果如下:

songvm@ubuntu:~/works/xdn$ gcc funcp.c -o funcp
songvm@ubuntu:~/works/xdn$ ./funcp
Name 1 : [Jim]
Name 2 : [Pike]
Name 3 : [Tala]
Name 4 : [Nor]
Name 5 : [Alan]

将上面的三行代码拆分成三个函数

  1. 以上结果是在意料之中的,现在将这三行主要代码拆分成三个函数:test_foreach, string_foreach, out_iname,让main函数的内容更简单!!!
  2. test_foreach,无参数,在此函数中定义字符串数组,由main函数直接调用。
  3. string_foreach,三个参数,数组指针,数组长度,函数指针(相对复杂)。
  4. out_iname,两个参数,一个整数,一个字符串指针,out_iname对应string_foreach函数的第三个参数,调用string_foreach函数时直接将out_iname函数名做为参数传给string_foreach。
    形参: void (*fp) (int idx, char *name)
    实参: void out_iname (int i, char *str)
    可见函数指针其实就是将一个函数做为参数传递给另一个函数。

代码如下:

/* filename: funcp.c */
#include <stdio.h>

/* compile : gcc funcp.c -o funcp
       run : ./funcp               */

/**/
void
out_iname (int i, char *str)
{
  printf ("Name %d : [%s]\n", i, str);
}

/**/
void
string_foreach (char **names, int len, void (*fp) (int idx, char *name))
{
  for (int i = 0; i < len; i++)
    fp (i + 1, names[i]);
}

/**/
void
test_foreach (void)
{
  char *buff[5] = { "Jim", "Pike", "Tala", "Nor", "Alan" };
  string_foreach (buff, 5, out_iname);
}

/**/
int
main (int argc, char *argv[])
{
  test_foreach ();
  return 0;
}
/* --(:O\^/O:)-- */

编译运行,结果如下:

songvm@ubuntu:~/works/xdn$ gcc funcp.c -o funcp
songvm@ubuntu:~/works/xdn$ ./funcp
Name 1 : [Jim]
Name 2 : [Pike]
Name 3 : [Tala]
Name 4 : [Nor]
Name 5 : [Alan]

自定义函数指针数据类型,把string_foreach函数参数搞得更简洁

自定义函数指针数据类型FP

typedef void (*FP) (int idx, char *name);

对应函数out_iname

void
out_iname (int i, char *str)
{
......
}

将代码更改,加入自定义函数指针数据类型FP,将string foreach函数的参数简化,代码如下:

/* define a function pointer datatype */
typedef void (*FP) (int idx, char *name);

......

//string_foreach (char **names, int len, void (*fp) (int idx, char *name))
string_foreach (char **names, int len, FP fp)

......

更改后编译运行,与原来的效果是一样的。

函数指针数据类型的变量定义、赋值和调用

  1. 更改后编译运行,结果是一样的,同样函数指针数据类型的变量也可以定义、赋值和调用。
  2. 定义两个简单的函数hi和hello,在test_function_pointer函数中定义两个函数指针变量,再赋值调用。
    代码如下:
/* filename: fp.c */
#include <stdio.h>

/* compile : gcc fp.c -o fp
       run : ./fp                */

/**/
void hi (void)
{
  printf ("Hi, morning!\n");
}

/**/
void hello (char *name)
{
  printf ("Hello %s!\n", name);
}

/**/
typedef void (*MyFunc) (char *str); //define data type

/**/
void
test_function_pointer (void)
{
  void (*fp) (void); //define variable fp
  MyFunc myfunc;     //define variable myfunc

  fp = hi;  //assignment
  fp ();    //call it

  myfunc = hello;   //assignment
  myfunc ("Tommy"); //call it
}

/**/
int
main (int argc, char *argv[])
{
  test_function_pointer ();
  return 0;
}

/* --(:O/^\O:)-- */

编译运行,结果如下:

songvm@ubuntu:~/works/xdn$ gcc fp.c -o fp
songvm@ubuntu:~/works/xdn$ ./fp
Hi, morning!
Hello Tommy!

以上操作,基本就会用函数指针了,下一步研究一下函数的递归调用!

标签:fp,funcp,int,void,C语言,char,foreach,函数指针
From: https://blog.csdn.net/gwsong52/article/details/142515433

相关文章

  • C语言中的转向语句
    在C语言中,转向语句用于改变程序的执行流。主要的转向语句包括goto、break和continue。它们各自有不同的用途和特性,能够在特定情况下简化或优化代码。本文将深入探讨这些语句,并通过复杂示例展示其应用。1.goto语句goto语句允许程序无条件跳转到程序中的某个标签。标......
  • C语言中的字符输入输出
    引言在C语言中,字符输入和输出是基本的操作。本篇文章将深入探讨两个重要的函数:putchar和getchar,并通过示例说明如何使用它们。1.字符输出:putchar函数putchar函数用于将一个字符输出到标准输出设备(通常是屏幕)。其函数原型为:intputchar(intchar);参数:接受一个字符作......
  • 移动数组中数字的方法(c语言)
    1.移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。2.我们确定数组,然后输入交换的几次,意思就是先前移......
  • 实验1 C语言输入输出和简单程序编写
    任务一#include<stdio.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n");printf("O\n");printf("<H>\n");printf("II\n");return0;} #inclu......
  • 【C语言】使用 OpenSSL 进行 AES CBC 加密与解密
    使用OpenSSL进行AESCBC加密与解密在这篇文章中,我们将使用OpenSSL库实现AESCBC模式的加密和解密功能。AES(高级加密标准)是一种对称加密算法,广泛应用于数据保护。本示例展示了如何使用PKCS#7填充标准来处理明文的长度,以及如何确保在加密和解密过程中正确管理密钥......
  • E33.【C语言】数据在内存中的存储练习集(未完)
    1.求下列代码的打印结果#include<stdio.h>intmain(){ chara=-1; signedcharb=-1; unsignedcharc=-1; printf("a=%d,b=%d,c=%d",a,b,c); return0;}答案速查分析之前讲过,char在VS中默认为signedchar,则a和b的打印结果应该是一样的存储范围:si......
  • 第二节 基本数据类型与简单程序设计(零基础学C语言)
    1.C语言基本数据类型 有字符型char、短整型short、整型int或long、单精度浮点型float、双精度浮点型double 2.常量(1)符号常量:在程序运行过程中,其值保持不变的量为常量。常量可以用一个标识符(宏名)来表示,成为符号常量,可在程序开头用#define来定义,如#definePI3.1415926,其......
  • C语言-“角谷猜想”是指:对任意自然数使用下面的方法计算得到一个新数;对这个新数继续使
     ......
  • C语言结构体、指针和常见数据结构
    在学习C语言时,结构体、指针和常见的数据结构如链表、栈、队列、二叉树等,是绕不开的重点。本篇博客用通俗易懂的方式,介绍这些概念,结合简单的代码示例,带你逐步掌握这些基础知识。1.结构体和指针我们先来看一眼结构体和指针,不懂这些的话,下面的代码肯定看不懂,没学过......
  • C语言分支语句和循环语句
     目录选择语句if-else语句if嵌套switch语句逻辑操作符!逻辑非&&逻辑与||  逻辑或循环语句while循环do-while循环for循环break和continue语句 break语句continue语句选择语句if-else语句if语句的语法形式if(表达式){语句}在C语言中非0为真,0为......