C语言指针进阶34一二级指针传参函数指针函数指针数组-创新互联

一级指针传参
void print(int* arr, int sz)
{int i = 0;
	for (i = 0; i< sz; i++)
	{printf("%d", *(arr + i));

	}


}


int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;//数组名是首元素地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);
	return 0;
}
void print(int* arr, int sz)
{int i = 0;
	for (i = 0; i< sz; i++)
	{printf("%d", *(arr + i));

	}



}
void test1(char* p)
{}




int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;//数组名是首元素地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	
	char ch = 'w';
	test1(&ch);

	char* p1 = &ch;
		test2(p1);

	print(arr, sz);
	return 0;
}
二级指针传参
void test(int** ppa)
{**ppa = 20;
}

int main()
{int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	test(ppa);
	printf("%d", a);
	return 0;
}

当函数参数为二级指针的时候,可以接收什么参数

创新互联建站总部坐落于成都市区,致力网站建设服务有成都网站建设、成都做网站、网络营销策划、网页设计、网站维护、公众号搭建、微信小程序开发、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!
void test(int** ppa)
{**ppa = 20;
}

int main()
{int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	test(ppa);
	test(&pa);//传一级指针变量的地址


	int* arr[10] = {0 };
	test(arr);//传存放一级指针的数组


	printf("%d", a);
	return 0;
}
函数指针

在这里插入图片描述
在这里插入图片描述

int Add(int x, int y)
{return x + y;
}

int main()
{int a = 0;
	int* pa = &a;

	char ch = 'w';
	char* pc = &ch;

	int arr[10] = {0 };
	int(*parr)[10] = &arr;//去除数组地址
	//parr是指向数组的指针  存放的是数组的地址

	//函数指针  存放函数地址的指针
	//&函数名 取得就是函数的地址
	  


	//函数指针存起来   创建一个变量pf
	int (*pf)(int, int) = &Add;
	printf("%d", &Add);
	printf("%d", Add);  //结果一样  函数名==&函数名


	return 0;
}

练习

void test(char* str)
{}
int main()
{	void(*pt)(char*) = &test;

	return 0;
}

如何解引用使用

int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf)(int, int) = &Add;
	 
	int ret = (*pf)(3, 5);
	printf("%d", ret);

	//要是直接写int ret = add(3, 5); 会重新在栈区开辟一块空间,但是通过指针调用就不会开辟那么多。节省内存的使用
	return 0;
}
int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf)(int, int) = &Add;   //&Add==add==pf
	int (*pf)(int, int) = Add;
	int ret = pf(3, 5);//得出*是摆设  随便写几个都没影响

	int ret = Add(3, 5);

	int ret = (*pf)(3, 5);
	printf("%d", ret);

	//要是直接写int ret = add(3, 5); 会重新在栈区开辟一块空间,但是通过指针调用就不会开辟那么多。节省内存的使用
	return 0;
}
4

在这里插入图片描述

(void(*)())0 把0强制类型转换为函数指针类型
*(void(p)())0 只是函数指针变量

(void()())0)解引用调用这个函数,相当于找到这个0地址函数因为放的无参 解引用调用后是不用传参((void()())0)();

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简易写法
在这里插入图片描述

函数指针数组
//函数指针数组  存放函数的指针数组
//
//整形指针int*
//整形指针数组  int*arr[5]

int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x -y;
}
int main()
{int (*pf1)(int, int) = Add;
	int (*pf2)(int, int) = Sub;
	int (*pfArr[2])(int, int) = {Add,Sub}//这就是函数指针数组 2是准备放的元素可以随意更改 后边大括号初始化


	

	
	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;
}
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 input = 0;
	//计算器  计算整型变量的加减乘除
	do
	{menu();
		
		int x = 0;
		int y = 0;
		int ret = 0;
		printf("请选择");
		scanf("%d", &input);
	
		switch (input)
		{case 1:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret=Add(x, y);
			printf("ret=%d\n", ret);
			break;
		case 2:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("ret=%d\n", ret);
			break;
		case 3:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("ret=%d\n", ret);
			break;
		case 4:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("ret=%d\n", ret);
			break;
		case 0:
			printf("退出程序");

			break;
		default:
			printf("选择错误,重新选择\n");

			break;
		}
		
	} while (input);



	
	return 0;
}

普通使用c语言实现简易计算器 由此可见代码冗余 我们可以用我们刚刚学的函数指针数组实现 怎么实现见下篇

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:C语言指针进阶34一二级指针传参函数指针函数指针数组-创新互联
转载来源:http://ybzwz.com/article/ipeij.html