指针数组、数组指针、函数指针、函数指针数组—定义、使用详解及简易版计算器的实现

上一篇文章 二级指针、指针数组讲过二级指针和指针数组的概念,这里就不详解阐述概念,这篇文章主要讲解如何使用。

指针数组

指针数组顾名思义其为一个数组,但是该数组里面存放的是指针。
因此其定义为:

#include <stdio.h>
int main()
{
	int a=10;
	int b=20;
	int c=30;
	int* arr[3]={&a,&b,&c};
	printf("%d\n",arr[0]);
	return 0;
}

数组指针

数组指针顾名思义其为一个指针,其定义为:
数组指针在定义大小时 取决于要存放的那个数组

#include <stdio.h>
{
	int arr[5]={0};  //此时arr大小是5
	int (*p)[5]=&arr; //此时&arr 取的是整个数组的地址 而p此时就是一个数组指针 这里(*p) 加括号是为了保证优先级更高 
	return 0;
}

函数指针

定义:如果一个指针变量可以用来存放一个函数的地址,则该变量称为 函数指针
具体实现如下:

#include <stdio.h>
int add(int x,int y)
{
	return x+y;
}
int main()
{
	int (*p)(int,int)=add; //此时p就是一个函数指针
	int ret=(*p)(1,2);
	printf("%d\n",ret);
	return 0;
}

函数指针的定义方法:类型 (*p) (入口参数的类型)
第一步:指针变量p要存放 add 函数 ,因为add函数返回的是 int ,因此 变量p的第一步就是 int …
第二步:当然此时 p 是一个指针变量 则其 (*p) 就必不可少 就是 int (*p) …
第三步:此时add函数的入口参数为 两个 int ,因此 函数指针p的定义为 int (*p) (int,int)
此时函数指针的p的定义就完成了
此时 p 是函数指针变量 int (*p) (int,int) 是p的类型
再举一个简单的例子:

#include <stdio.h>
void print(char* str)
{
	printf("%s\n",str);
}
int main()
{
	void (*p)(char*)=print;
	(*p)("hello fancy!");
	return 0;
}

函数指针的重命名:
假设函数指针变量p的类型为 void (*) (int)
则其重命名为
typedef void (*)

函数指针数组

前面讲了函数指针是一个可以存放函数地址的变量,那如果我们要存放多个地址,应该怎么操作,
此时引入
函数指针数组:把函数的地址存放到一个数组中,则该数组称之为 函数指针数组

#include <stdio.h>
int add(int x,int y)
{
	return x+y;
}
int sub(int x,int y)
{
	return x-y;
}
int main()
{
	int (*p[2])(int ,int) = {add,sub}; //此时 p 就是 函数指针数组
	printf("1+2=%d\n",p[0](1,2));
	printf("1-2=%d\n",p[1](1,2));
	return 0;
}

函数指针数组的用途-转移表

简易版计算器的实现-函数指针数组

#include <stdio.h>
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;
}
void menu()
{
	printf("**************************\n");
	printf("***** 1.Add    2.Sub *****\n");
	printf("***** 3.Mul    4.Div *****\n");
	printf("*****     0.exit     *****\n");
	printf("**************************\n");
}
int main()
{
	int (*p[5])(int ,int)={0,Add,Sub,Mul,Div};
	int input=0;
	int x=0,y=0;
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d",&input);
		if(input>=1&&input<=4)
		{
			printf("请输入两个操作数:");
			scanf("%d %d",&x,&y);
			printf("ret is = %d\n",p[input](x,y));
		}
		else if(input==0)
		{
			printf("退出");
		}
		else
		{
			printf("选择错误,请从新选择!");
		}
	}while(input);
	return 0;
}

总结

int Add(int x,int y)
{
	return x+y;
}
#include <stdio.h>
{
	//指针数组
	int a=10;
	int b=20;
	int* arr[2]={&a,&b};

	//数组指针
	int arr[3]={0};
	int (*p)[3]=arr;

	//函数指针
	int (*p)(int ,int)=Add;

	//函数指针数组
	int (*p[2])(int ,int)={Add};
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值