玩转指针重难点(2)

函数指针

定义:指向函数的指针,用来存放函数的地址
这里我们举一个小例子

int Add(int x, int y)
{
    
    
	return x + y;
}
int main()
{
    
    
	int a = 10;
	int *pa = &a;//pa就是整型指针
	char arr[5] = {
    
     0 };
	char(*parr)[5] = &arr;//parr就是数组指针
	printf("%p\n", &Add);
	int(*pf)(int,int) = &Add;//pf就是函数指针
	return 0;
}

练习题
用函数指针模拟实现strlen函数

#include<stdio.h>
#include<assert.h>
int my_strlen(const char *str)
{
    
    
	assert(str!=NULL);
	int count = 0;
	while (*str)
	{
    
    
		*str++;
		count++;
	}
	return count;
}
int main()
{
    
    
	char arr[] = "abcdef";
	int(*pf)(const char*) = my_strlen;
	int len = (*pf)("bit");
	printf("%d", len);
	return 0;
}

接下来思考一个题

(*(void(*)())0)();

大家先看里面,void(*)()是一个函数指针类型,0是一个整型数字,这里含义是将0强制转换为函数指针类型再解引用。整个题目的意思是,调用0地址处的函数,该函数无参数,返回类型的void。(如果可以独立思考出这个题基本上函数指针的理解就没有问题了)

再来看下面这一个问题
void(signal(int, void()(int)))(int);

这是一个函数声明,声明的函数叫signal,signal函数有两个参数,第一个参数类型是int,第二个参数类型是一个函数指针,该函数指针指向的函数参数是Int,返回类型的void。
signal函数的返回类型是一个函数指针,该函数指针指向的函数参数是Int,返回类型是void。
可是,这样写可读性太差了
由此我们需要起一个别名,简化一下

typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);

函数指针数组

定义:存放函数指针的数组
eg:int (*p[2])(int,int)={Add,Sub};
简化加减乘除的算法

int Add(int x,int y)
{
    
    
	return x + y;
}
int sub(int x, int y)
{
    
    
	return x - y;
}
int mul(int x, int y)
{
    
    
	return x*y;
}
int div(int x, int y)
{
    
    
	return x / y;
}
int main()
{
    
    
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	int (*pfArr[])(int,int) = {
    
     0, Add, sub, mul, div };
	do
	{
    
    
		if (0 == input)
		{
    
    
			printf("退出程序");
			break;
		}
		else if (input>=1&&input<=4)
		{
    
    
	         scanf("%d", &input);
		     printf("请输入两个操作数");
		     scanf("%d %d", &x, &y);
		     ret = pfArr[input](x, y);
		     printf("ret=%d\n", ret);
		}
		else
		{
    
    
			printf("选择错误\n");
		}
	} while (input);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_53831496/article/details/113758174
今日推荐