首页 > 其他分享 >指针数组、回调函数

指针数组、回调函数

时间:2024-08-10 10:55:34浏览次数:9  
标签:函数 int char 数组 函数指针 指针

  • 指针 + 二维字符型数组

  • char  s[][10] = {"hello", "world", "china"};

        char (*p)[10] = s;    // p 指向二维数组 s  -----  *(*(p+i)+j)  <=>  s[i][j]

        char [10]  s[3];   //此时二维数组的元素是一个一维数组,定义了一个存放字符串的数组

  • char *p = "hello";  //p 的类型是 char *  , char * 的指针变量 p 是一个字符串

        指针数组:存放地址数据的数组

char*  pstr[3] = {"hello", "world", "china"}; // 数组中存放的是字符串的地址   

        pstr[0] ----类型-----> char * 

        &pstr[0] -----类型----> char * *

        -------> char * *p

        ---->   char* *q = pstr; //q 二级指针 

例:对字符串指针数组的冒泡排序

void bubbleSort(char* *p,int len)
{
	int i = 0;
	int j = 0;

	for (i = len-1; i > 0; --i)
	{
		for (j = 0; j < i; ++j)
		{
			if (strcmp(*(p+j),*(p+j+1)) > 0)
			{
				char *t = *(p+j);
				*(p+j) = *(p+j+1);
				*(p+j+1) = t ;
			}
		}
	}
}
  • 指针 + 函数

通过 指针 的方式来调用函数,函数名代表函数的入口地址,CPU通过函数名来调用代码。

  • eg: int main(int argc, const char *argv[])

        argc : 命令行参数的个数

        argv :存放命令行参数的字符串的指针数组

  •  eg:  int  add(int a, int b) 

①函数名 ------ 代表函数的入口地址 

②函数名对应的数据类型----> 函数类型:int (int a, int b) -----> 代表返回值为 int 型,有两个 int 型参数的一类函数。

        ------>int  (*p)  (int,int) = add;  // p 指向了add 函数

③调用: int ret = p(1,2);    // int ret = (*p)(1,2);不写 * 是一种简化的、常见的用法,编译器会自动理解这是通过函数指针进行函数调用。

  1. 可以定义一个函数类型的指针变量来保留函数的入口地址
  2. 有了这个指针变量,就能通过这个指针变量来进行 函数调用。
  • 回调函数:callback

通过函数指针调用函数就是回调。C语言使用了函数指针这种方式实现了回调。

例:写一个程序 实现加、减、乘、除,以回调函数的形式,打印对应的结果

#include <stdio.h>

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

int sub(int a,int b)
{
	return a - b;
}
int mul(int a,int b)
{
	return a * b;
}
int div(int a,int b)
{
	return a / b;
}


void processData(int a,int b,int(*p)(int,int))//找准基类型,然后定义它的指针
{
	printf("result: %d\n",p(a,b));
}

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

	processData(1,2,add);
	processData(1,2,sub);
	processData(1,2,mul);
	processData(1,2,div);
	
	return 0;
}

 

为什么通过指针的方式来调用函数?

  1. 实现动态调用:在某些情况下,直到程序运行时才能确定要调用哪个函数。通过函数指针,可以根据不同的条件或输入动态地选择要执行的函数,增加了程序的灵活性和可扩展性。
  2. 模拟面向对象编程中的多态性:在 C 语言中,虽然没有真正的面向对象特性,但通过函数指针可以在一定程度上模拟多态的行为,使得不同的函数实现可以通过相同的接口(函数指针)被调用。
  3. 提高代码的可维护性和可重用性:将函数的调用通过函数指针进行抽象,可以使代码更具模块化,方便对功能进行修改和替换,而不需要修改大量的直接函数调用代码。
  4. 优化性能:在一些特定的架构或优化场景中,使用函数指针可能会带来性能上的优势,例如减少分支预测错误等。

标签:函数,int,char,数组,函数指针,指针
From: https://blog.csdn.net/weixin_62989562/article/details/141022233

相关文章

  • 指针、快速排序
    (一)指针1.指针变量初始化(1)如果指针变量没有初始化,此时是随机值。初始化可以让指针变量有明确指向。eg:①int a=10;     int *p=&a;②int *p=NULL;//0号地址----空指针(2)赋值:方式①: int *p;  p=NULL;方式②: inta;  int*p; p=......
  • 指针、字符串函数
    (一)指针操作一维字符型数组const关键字(只读)eg:(1)int *p;  //基类型(目标类型)(2)int a= 10;   ①const int *p=&a;  //const限定是基类型,表示不能通过*p的方式修改基类型的数据   ②int const *p=&a;  //与①等价     ......
  • 在 SQL 中,怎样使用聚合函数(如 SUM、AVG、COUNT 等)来计算数据的总和、平均值和数量?
    在SQL中,可以使用聚合函数来计算数据的总和、平均值和数量。以下是一些常用的聚合函数的示例:SUM函数:计算指定列的总和。SELECTSUM(column_name)FROMtable_name;AVG函数:计算指定列的平均值。SELECTAVG(column_name)FROMtable_name;COUNT函数:计算指定列的数......
  • 每天深解一个字符串类函数之strcat函数
    目录前言:一、引用头文件二、strcat函数的作用三、理解strcat函数的定义1、返回类型2、参数四、使用strcat函数1、编写代码2、调试运行控制台监视器五、注意要点六、模拟实现前言:每天深入了解一个字符串类函数今天我们要学习的是strcat函数,一个追加字符串......
  • 60个“特征工程”计算函数(Python代码)
    近期一些朋友询问我关于如何做特征工程的问题,有没有什么适合初学者的有效操作。特征工程的问题往往需要具体问题具体分析,当然也有一些暴力的策略,可以在竞赛初赛前期可以带来较大提升,而很多竞赛往往依赖这些信息就可以拿到非常好的效果,剩余的则需要结合业务逻辑以及很多其他的......
  • 编写类 MyTools 类,编写一个方法可以打印二维数组的数据。 2) 编写一个方法 copyPerson
    1publicclassMethodExercise02{2publicstaticvoidmain(String[]args){34Personp=newPerson();5p.name="milan";6p.age=100;7//创建tools8MyToolstools=newMyTools();9......
  • 远程桌面连接时“发生身份验证错误。要求的函数不受支持”
    问题:连接远程桌面时提示“身份验证错误,要求的函数不受支持”解决方法:一、修改注册表1、WIN+R,然后运行regedit命令2、找到路径:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System3、然后在System文件夹内创建文件夹:\CredSSP\Parameters......
  • 指针与一维数组
    目录指针:指针变量的初始化:赋值:指针作为函数参数://一维整型数组指针实现一维数组逆序:指针实现选择排序:指针实现冒泡排序:指针实现插入排序:指针实现一维整型数组二分查找(有序数组前提下):指针实现一维数组快速排序:指针:指针变量的初始化:如果指针没有初始化,此时是随机......
  • 指针进阶--指针与一维字符型数组
    目录const关键字:constinta =10;constint*p=&a;(等价于intconst*p=&a)const的应用:一维字符型数组与字符函数指针实现strcpy的功能:指针实现strncpy的功能:指针实现strcat功能:指针实现strncat功能:指针实现strcmp功能:指针实现strncmp功能:void*指针(万能指针):指......
  • 深入了解指针(5)
    1.数组指针变量2.⼆维数组传参的本质3.函数指针变量2.⼆维数组传参的本质3.函数指针变量)1.数组指针变量1.1了解数组指针变量的概念整形指针变量——变量——存放的是整形的地址字符指针变量——变量——存放的是字符的地址数组指针——变量—......