C 语言课堂知识小结(3)-函数指针

本文详细介绍了C语言中数组指针、指针数组、数组名与&数组名的区别、参数传递的原理,特别强调了函数指针的概念和使用,包括如何用函数指针实现简单的计算器功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、数组指针和指针数组

2、数组名和&数组名的区别

 3、参数传递

4、函数指针

5、用C语言简单实现计算器


 

1、数组指针和指针数组

指针数组:是一个数组,用来存放指针。

  int *arr[10]={0};

数组指针:是一个指针,指向数组。

int arr[10]={0};

int *p=&arr;

int (*p)[5]={0};//  p先和*结合,说明p是一个指针变量,指向数组,然后与操作符[]结合,访问数组中的元素。

2、数组名和&数组名的区别

数组名代表数组首元素的地址,&数组名表示的是整个数组的地址。虽然二者的值都是一样,但是二者值得含义不一样。

int arr[10]={0};

arr+1 表示跳过一个一个数组元素。

&arr+1 表示跳过一整个数组

如图:

 3、参数传递

一维数组传参

int arr[10]={0};

test(arr)

arr是数组名,代表数组元素的首地址,既然传过去是个地址,那么不仅可以用形参数组接收也可以用指针接收。

 参数写法:

1、test(int arr[])

形参的 int arr[]  看起来是个数组,实际上并不是,它是一个空间的地址。

2、test(int arr[10])

3、test(int* p)

二维数组传参:

int arr[3][5];

arr,二维数组的元素名,表示数组首元素的地址,但是二维数组的数组名表示第一行元素的地址。是一维元素的地址

1、test(int arr[3][5])

2、test(int arr[][5])

可以不必知道二维元素有几行,但是必须知道二维数组有几列。行可省略,列不能省略。

3、test(int (*arr)[5])  数组指针

一级指针传参:

int a=10;

int *p=&a;

test(p);

test(int *p)

二级指针传参

int a=10;

int *p=&a;

int **pp=&p;

test(pp);

test(int **p);

二级指针存放的是一级指针的地址

 

4、函数指针

指向函数的指针,存放的是一个函数的地址,

void test(int a,int b);

void (*ptr)(int,int)=&test;

ptr 先与操作符*结合,表示ptr是一个指针,存放的是函数test的地址,后面的(int ,int )表示指向的函数中有两个整型的变量。void 表示指向的函数。

函数指针数组:存放的类型都是函数指针的数组,是一个数组。

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 (*pf1)(int, int) = Add;
  int (*pf2)(int, int) = Sub; 

   int (*pf3)(int, int) = Mul;
   int (*pf4)(int, int) = Div;

用数组表示为: int *(pf[])(int,int)={Add,Sub,Mul,Div};

用法:

	int i = 0;
	for (i = 0; i < 4; i++)
	{
		int ret = arr[i](2, 8);
		printf("%d", ret);
	}

2和8在加减乘除。

5、用C语言简单实现计算器

void menu()
{
	printf("*******************\n");
	printf("*******1>Add****\n");
	printf("*******2>Sub****\n");
	printf("*******3>Mul****\n");
	printf("*******4>Div****\n");
	printf("*******0.exit******\n");
	printf("*******************\n");

}

int main()
{
	int input = 0;
	int (*arr[])(int, int) = { NULL,Add,Sub,Mul ,Div };
	int x = 0;
	int y = 0;

	do 
	{
		menu();
		printf("请输入->");
		scanf("%d", &input);
		
		if (input == 0)
		{
			printf("离开游戏\n");
			break;
		}
		else if (input > 0 && input < 5)
		{
			printf("请输入数字数数字\n");
			scanf("%d%d", &x, &y);
			int ret = arr[input](x, y);
			printf("%d\n", ret);
			break;
		}

		else
		{
			printf("输入错误,请重新输入\n");
		
		}
	} while (input);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开拓的嚣张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值