进阶指针详解(数组指针,指针数组,函数指针)

目录

一.指针数组

二.数组指针


一.指针数组

数组指针顾名思义也就是存放指针的数组,目的是将一类指针存放到一个数组中方便引用例如

#include<stdio.h>
int main()
{
	int a = 1, b = 2, c = 3, d = 4;
	int* parr[] = { &a,&b,&c,&d };
	int i=0;
	for (i = 0; i < 4; i++)
	{
		printf("%d ", *parr[i]);
	}
	return 0;
}

我们发现这里调用数组也可以得到目标数字。

这只是很简单的一种用法,后面会跟大家分享更多的用法。这里他的类型是int*【】是根据优先级决定的,由于【】的优先级比*高所以为数组。后面我们会学到指针数组,容易混淆。

二.数组指针

这个同样我们也是可以根据名字得出他是一个指针,也就是存放数组的指针类型是int(*)【】同指针指针数组差不多【】的优先级高与*所以要将*用括号括起来。

#include<stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int(*parr)[] = &arr;
	//这里需要注意c语言中有两种情况表示的是整个数组的地址
	//1.&加数组名表示整个数组的地址
	//2.数组名单独放在sizeof()中
	//其余情况数组名表示首元素的地址
	int i = 0;
	for (i = 0; i < 9; i++)
	{
		printf("%d ", *(*parr + i));
	}
	return 0;
}

除了可以通过数组指针来找到原数组的元素外还可以用来拿到二维数组的元素就像这样

#include<stdio.h>
void* print(int(*p)[4])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
		for (j = 0; j < 4; j++)
		{
			printf("%d ", (*(p+i))[j]);
		}
		printf("\n");
		//上述是两种表述方法
		//这里说一下arr【1】=*(arr+1);
	}
}
int main()
{
	int arr[3][4] = { {1,2,3,4},{2,3,4,5},{3,4,5,6}};
	print(arr);
	return 0;
}

这里的数组指针=&arr符合我们在代码中写的代表整个数组地址的情况,则这里的p就是arr整个数组的地址。我们学二维数组的时候知道二维数组就相当于与其行数相等的一维数组则我们这里的p+i就i选哪个当于拿到了第i行的首元素地址。

三.函数指针

在这之前我们已经学到了各种指针那是不是还会有函数指针呢,也就是用来存放函数的指针。下面就来为大家讲解一下函数指针,他的类型是int(*)(参数类型)  。在学习函数指针之前首先要讲到函数名所代表的含义

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a=1, b=6;
	printf("%d\n", Add(a, b));
	printf("%p\n", Add);
	printf("%p\n", &Add);

	return 0;
}

由代码的输出结果我们可以看出函数名与&函数名所打印的结果一样,这样我们就可以总结出函数名与&函数名都是函数的地址。

这样我们就可以创建一个存放函数Add地址的指针int(*padd)(int,int)=Add或者int(*padd)(int,int)=&Add

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a=1, b=6;
	int(*padd1)(int, int) = Add;
	int(*padd2)(int, int) =&Add;
	printf("%d\n", padd1(a, b));
	printf("%d\n", padd2(a, b));

	return 0;
}

我们可以看到padd1与padd2的输出结果相同,这证实了我的上面所说的。

四.函数指针数组

既然整形可以有整形数组,字符可以有字符数组,那么函数是否可以存储到数组中统一运用呢?答案是肯定的,只不过由于函数名本身就是一个地址,那么也算以抵制的形式的方式存储到数组中。所以也成为函数指针数组。他的类型是int(*[])(),这边*与[]在一个括号内说明他是一个数组,后面的传参括号说明他是一个函数,这一是因为()的优先级高与*和[]。

函数指针可以帮我恶魔能实现将函数进行统一的处理。下面给大家讲解利用函数指针数组写一个简易的计算机代码,来更方便大家的理解

#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 main()
{
	int input=0;
	int (*parr[])(int, int) = { NULL,Add,Sub,Mul,Div };
	do
	{
		int a = 0;
		int b = 0;
		menu();
		printf("请选择:");
		scanf("%d", &input);
		if (input > 0)
		{
			printf("请输入两个操作数:");
			scanf("%d%d", &a, &b);
			printf("结果是:%d\n",parr[input](a, b));
        }
		else if (input == 0)
		{
			printf("退出成功\n");
		}
		else
		{
			printf("输入错误请重新输入");
		}
	} while (input);
	return 0;
}

这就是函数数组指针的大致内容。

如果大家喜欢博主的可以一键三连,欢迎大佬们指点!谢谢大家了!拜拜。

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值