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;
}
相关推荐
cici158748 小时前
非线性模型预测控制(NMPC)基于CasADi的MATLAB实现
开发语言·matlab
独特的螺狮粉8 小时前
开源鸿蒙跨平台Flutter开发:量子态波函数坍缩系统-波动力学与概率云渲染架构
开发语言·flutter·华为·架构·开源·harmonyos
冰暮流星8 小时前
javascript之dom访问属性
开发语言·javascript·dubbo
lsx2024068 小时前
SQL Auto Increment 自动增长
开发语言
t198751288 小时前
MATLAB模糊数学模型(Fuzzy Mathematical Model)实现指南
开发语言·matlab
Evand J8 小时前
MATLAB批量保存现有绘图窗口的方法,简易方法,直接保存到当前目录,不手动设置
开发语言·matlab·教程
忽而今夏&_&8 小时前
python 刷题最基础的一些
开发语言·python
quintin-lee8 小时前
Postgres 内核:从入门到“入土” (三) —— Page 结构:数据是如何在磁盘上“躺平”的
c语言·数据库·postgresql·数据库架构
前端郭德纲8 小时前
JavaScript 原型相关属性详解
开发语言·javascript·原型模式
于先生吖8 小时前
基于 SpringBoot 架构,高性能 JAVA 动漫短剧系统源码
java·开发语言·spring boot