C语言-指针终阶

1,数组指针

2,函数指针

3,函数指针练习

写一个计算器
使用函数指针后的计算器

4,指向[函数指针数组]的指针


1,数组指针

复制代码
#include<stdio.h>
//数组指针
//int main() {
//	char* arr[5] = { 0 };//声明一个指针数组 arr,包含5个元素,每个元素类型为 char*(指向字符的指针)
//	char* (*pc)[5] = &arr; //声明一个数组指针 pc,它指向一个包含5个 char* 元素的数组。
//
//	char ch = 'w';//声明字符变量 ch,存储字符 'w'(ASCII值119),占用1字节内存。
//	char* p1 = &ch;//声明字符指针 p1,初始化为 ch 的地址。
//	char** p2 = &p1;//声明二级指针 p2(指向 char* 的指针),初始化为 p1 的地址
//	return 0;
//}

//
//int main() {
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	
	//规范使用
	//int* p = arr;
	//int i = 0;
	//for ( i = 0; i < 10; i++)
	//{
	//	printf("%d ", *(p + i));
	//}

//	//不规范使用
//	int (*p)[10] = &arr;//数组指针
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for ( i = 0; i < sz; i++)
//	{
//		printf("%d ", *(*p + i));//p是指向数组的,*p其实就相当于数组名,数组名又是数组首元素的地址
//		//所以*p本质上是数组首元素的地址
//	}
//	return 0;
//}

//数组指针的正确使用
void print1(int arr[3][5], int r, int c) {
	int i = 0;
	for ( i = 0; i < r; i++)
	{
		int j = 0;
		for ( j = 0; j < c; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
void print2(int (*p)[5], int r, int c) {//int (*p)[5]  此处用的是指向一维数组的指针
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			//printf("%d ", *(*(p+i)+j));
			printf("%d ", p[i][j]);//完全等价


		}
		printf("\n");
	}
}
int main() {
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	print1(arr, 3, 5);
	print2(arr, 3, 5);

	return 0;
}

2,函数指针

复制代码
#include<stdio.h>
//数组指针-->指向数组的指针就是数组指针
//函数指针-->指向函数的指针就是函数指针
//int Add(int x,int y) {
//	return x + y;
//}
//int main() {
//	int arr[5] = { 0 };
//	//&数组名 - 取出的数组的地址
//	int (*p)[5] = &arr;//数组指针
//
//	//&函数名 - 取出的就是函数的地址
//	printf("%p\n", &Add);
//	printf("%p\n", Add);
//	//对于函数来说,&函数名和函数名都是函数的地址
//
//	int (*pf)(int, int) = &Add;
//	int (*pf)(int, int) = Add;
//
//	int ret = (*pf)(2, 3);
//	int ret = Add(2, 3);
//	int ret = pf(2, 3);
//	printf("%d ", ret);
//	return 0;
//}

//函数指针应用
int Add(int x, int y) {
	return x + y;
}
void calc(int(*pf)(int, int)) {
	int a = 3;
	int b = 5;
	int ret = pf(a, b);
	printf("%d\n", ret);
}
int main() {
	calc(Add);
	return 0;
}

3,函数指针练习

写一个计算器
复制代码
#include<stdio.h>
//函数指针的用途
//写一个计算器
//加 减 乘 除
void menu() {
	printf("***********************************\n");
	printf("*********1. add   2,sub   *********\n");
	printf("*********3. mul   4.div   *********\n");
	printf("*********0. exit          *********\n");
	printf("***********************************\n");

}

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;
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input) {
		case 1:
			printf("请输入两个数:>");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个数:>");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个数:>");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个数:>");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}
使用函数指针后的计算器
复制代码
#include<stdio.h>
////使用函数指针后
//void calc(int (*pf)(int, int)) {
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	printf("请输入两个数:>");
//	scanf("%d %d", &x, &y);
//	ret = pf(x, y);
//	printf("%d\n", ret);
//}
//int main() {
//	int input = 0;
//	do {
//		menu();
//		printf("请选择:>");
//		scanf("%d", &input);
//		switch (input) {
//		case 1:
//			calc(Add);
//			break;
//		case 2:
//			calc(Sub);
//
//			break;
//		case 3:
//			calc(Mul);
//
//			break;
//		case 4:
//			calc(Div);
//
//			break;
//		case 0:
//			printf("退出计算器\n");
//			break;
//		default:
//			printf("选择错误\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}

//函数数组指针的应用
//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 (*pf)(int, int) = Add;//pf是函数指针
//	int (*arr[4])(int, int) = { Add,Sub,Mul,Div };//arr就是函数指针的数组
//	int i = 0;
//	for ( i = 0; i < 4; i++)
//	{
//		int ret = arr[i](8, 4);
//		printf("%d \n", ret);
//	}
//	return 0;
//}

//计算器再进化
void menu() {
	printf("***********************************\n");
	printf("*********1. add   2,sub   *********\n");
	printf("*********3. mul   4.div   *********\n");
	printf("*********0. exit          *********\n");
	printf("***********************************\n");

}

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[5])(int, int) = { 0,Add,Sub,Mul,Div };

	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if (input==0)
		{
			printf("退出\n");
		}
		else if (input>=1&&input<=4)
		{
			printf("请输入2个操作数:>");
			scanf("%d %d", &x, &y);
			ret = pfArr[input](x,y);
			printf("%d\n", ret);
		}
		else {
			printf("选择错误\n");

		}
	} while (input);
	return 0;
}

4,指向[函数指针数组]的指针

复制代码
#include<stdio.h>
//指向[函数指针数组]的指针
int main() {

	//函数指针数组
	int (*pfArr[])(int,int) = { 0,Add,Sub,Mul,Div };

	//指向[函数指针数组]的指针
	int (*(*ppfArr)[5])(int, int) = &pfArr;
	return 0;
}
相关推荐
散峰而望2 小时前
C++ 启程:从历史到实战,揭开命名空间的神秘面纱
c语言·开发语言·数据结构·c++·算法·github·visual studio
易辰君2 小时前
【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解
开发语言·爬虫·python
普通网友2 小时前
PHP语言的正则表达式
开发语言·后端·golang
黎雁·泠崖2 小时前
Java常用类核心详解(七):正则表达式 Regex 从入门到实战
java·开发语言·正则表达式
PingdiGuo_guo2 小时前
C++数据类型、变量常量
开发语言·c++
水饺编程2 小时前
第4章,[标签 Win32] :TextOut 测试案例3代码改编
c语言·c++·windows·visual studio
多恩Stone3 小时前
【C++ debug】在 VS Code 中无 Attach 调试 Python 调用的 C++ 扩展
开发语言·c++·python
PingdiGuo_guo3 小时前
C++联合体详解!
开发语言·c++
浅念-4 小时前
C++ 继承
开发语言·c++·经验分享·笔记·学习·算法·继承