高级指针总结

指针数组

首先声明,指针数组是数组,比如 int *arr1[10](是数组)char*arr2[4](是数组) char**arr3[5](是数组)

数组指针

是指针,指针都有类型,那么,int*print是能指向整型数据的指针,[]*的优先级高,但是int (*p)[10]确是数组指针,这个指针有能力指向一个数组。接下来来看一段代码:

int arr[10]={0};

arr;//数组首元素的地址

&arr;//数组地址

Printf(“%p\n”,arr);首地址

Printf(“%p\n”,arr+1);第二个元素地址;

Printf(“%p\n”,&arr+1);//下一个数组个的首地址;

Printf(“%p\n”,&arr[0]+1);//第二个元素的地址;

数组指针存放数组地址最合适;

对于二维数组的传参,由于二维数组在内存中是连续存放地址的,其实它的本质是指向一位数组的指针,所以必须指定这个所指向的一维数组的长度。

函数指针

在内存中任何东西都有地址,函数也不例外,那么值得思考的问题就是,函数的地址应该怎样保存,,即就是通过函数指针存放,比如 void (*pfun1)();

函数指针数组

Int (*parr1[10])();

函数指针数组的用途就是:转移表。(计算器)代码如下:

#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)

int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int mydiv(int a, int b)
{
	return a / b;

}


int main()
{
	int x = 0;
	int y = 0;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, add, sub, mul, mydiv };//转移表
	while (input)
	{
		printf("*****************************\n");
		printf("  1.add               2.sub  \n");
		printf("  3.mul               4.div  \n");
		printf("*****************************\n");
		printf("请选择:");
		scanf("%d", &input);
		if ((input<5&& input>0))
		{
			printf("输入操作数");
			scanf("%d %d", &x,&y);
			ret = (*p[input])(x, y);
		}
		else
			printf("输入有误");
		printf("ret=%d\n", ret);
	}
	return 0;
}

函数指针数组指针

看代码

void test(const char*str)

{
	printf("%s\n",str); }
int main()
{
	void(*pfun)(const char*) = test;//函数指针pfun
	void(*pfunarr[5])(const char* str);//函数指针数组pfunarr
	pfunarr[0] = test;
	void(*(*pfunarr)[10])(const char*);//指向函数指针数组pfunarr的指针ppfunarr;
	return 0;}


可以无限制的加*,当然在实际编码的时候不存在这么复杂的操作,因为代码是给人看的。哈哈。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值