C语言#23(指针进阶)

发布于:2022-10-30 ⋅ 阅读:(451) ⋅ 点赞:(0)

目录

指针与数组

指针数组-用来存放指针的数组

数组指针-能够指向数组的指针

二维数组与指针

 分辨与理解

 指针传参

 函数指针

函数指针数组​编辑​编辑

 简易计算器

简易计算器(使用函数指针数组)

函数指针数组指针

 回调函数(通过函数指针调用的函数)

加深理解


指针与数组

 为什么会作这样?

ch1和ch2是开辟两个新的空间来存储"hello world",而ch3和ch4是指向同一个空间,而不是开辟两个新空间来存储"hello world"

指针数组-用来存放指针的数组

数组指针-能够指向数组的指针

 arr与&arr的区别

#include<stdio.h>

int main()
{
	int arr[10];
	int* pa = arr;//arr - 数组名是首元素的地址 - arr[0]的地址
	int (*parr)[10] = & arr;//取出的是数组的地址
	//parr就是一个数组指针
	printf("%p\n", arr);//与arr+1相差4个字节,因为一个整形的大小就是4个字节
	printf("%p\n", arr+1);

	printf("%p\n", &arr);//与&arr+1相差40个字节,因为跳过了一个数组,而这个数组里有10个整形,所以跳过40个字节
	printf("%p\n", &arr+1);

}

(上图来自比特鹏哥直播视频截图)

二维数组与指针

 分辨与理解

 指针传参

 函数指针

数组名 != &数组名

函数名 == &函数名

 理解

(上图来自比特鹏哥直播视频截图) 

函数指针数组

 简易计算器

#define _CRT_SECURE_NO_WARNINGS 1
#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("*****************************\n");
}
int main()
{
	menu();
	int input = 0;

	do
	{
		int x = 0;
		int y = 0;
		int c = 0;
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			c = Add(x, y);
			printf("%d\n", c);
			break;
		case 2:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			c = Sub(x, y);
			printf("%d\n", c);
			break;
		case 3:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			c = Mul(x, y);
			printf("%d\n", c);
			break;
		case 4:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			c = Div(x, y);
			printf("%d\n", c);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("输入错误\n");
			break;

		}


	} while (input);
	return 0;

}

简易计算器(使用函数指针数组)

#define _CRT_SECURE_NO_WARNINGS 1
#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("*****************************\n");
}
int main()
{
	menu();
	int input = 0;

	do
	{
		int x = 0;
		int y = 0;
		int c = 0;
		printf("请选择:>");
		scanf("%d", &input);
		if(input > 0 && input < 5)
		{
			int (*pfarr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			c = pfarr[input](x, y);
			printf("%d\n", c);
		}
		else if (input == 0)
		{
			printf("退出程序\n");
		}
		else
		{
			printf("输入错误\n");
		}
		//switch (input)
		//{
		//case 1:
		//	printf("请输入两个操作数:");
		//	scanf("%d %d", &x, &y);
		//	c = Add(x, y);
		//	printf("%d\n", c);
		//	break;
		//case 2:
		//	printf("请输入两个操作数:");
		//	scanf("%d %d", &x, &y);
		//	c = Sub(x, y);
		//	printf("%d\n", c);
		//	break;
		//case 3:
		//	printf("请输入两个操作数:");
		//	scanf("%d %d", &x, &y);
		//	c = Mul(x, y);
		//	printf("%d\n", c);
		//	break;
		//case 4:
		//	printf("请输入两个操作数:");
		//	scanf("%d %d", &x, &y);
		//	c = Div(x, y);
		//	printf("%d\n", c);
		//	break;
		//case 0:
		//	printf("退出程序\n");
		//	break;
		//default:
		//	printf("输入错误\n");
		//	break;

		//}


	} while (input);
	return 0;

}

函数指针数组指针

 回调函数(通过函数指针调用的函数)

#define _CRT_SECURE_NO_WARNINGS 1
#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("*****       5.exit      *****\n");
	printf("*****************************\n");
}
//回调函数
int Calc(int(*pfa)(int, int))
{
	int x = 0;
	int y = 0;
	printf("请输入两个操作数:");
	scanf("%d %d", &x, &y);
	return pfa(x, y);
}
int main()
{
	menu();
	int input = 0;

	do
	{
		int x = 0;
		int y = 0;
		int c = 0;
		printf("请选择:>");
		scanf("%d", &input);


		switch (input)
		{
		case 1:
			c = Calc(Add);
			printf("%d\n", c);
			break;
		case 2:
			c = Calc(Sub);
			printf("%d\n", c);
			break;
		case 3:
			c = Calc(Mul);
			printf("%d\n", c);
			break;
		case 4:
			c = Calc(Div);
			printf("%d\n", c);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("输入错误\n");
			break;

		}


	} while (input);
	return 0;

}

加深理解

数组名— 表示整个数组 

&数组名 — 表示的是整个数组 — 取出的是整个数组的地址

除此之外,所以的数组名都表示首元素的地址

(上图来自比特鹏哥直播视频截图)


网站公告

今日签到

点亮在社区的每一天
去签到