指针进一步详解

关于指针中*操作符的使用

*操作符的作用是对指针解引用,也就是将指针中的内容提取出来

但有时候我们看到的代码中,在对指针内容进行操作的时候好像可以不用*操作符,那什么情况不用呐

正如图片中文字叙述的,在打印整体的时候,指针可以不加*操作符,打印数组中的某一个字符或者数字要加*操作符

下面将介绍指针中几个重要的知识点

1.数组指针

数组指针也就是指向数组的指针,它和整型指针,字符指针一样都是指向某一个特定对象的

正如上面的例子显示的,arr是一个指向数组的指针,它的类型是int(*)[10],其中[]中的10表示指向的数组有10个元素,每个元素的类型是Int型。如果要通过指针变量来操作数组中的内容,方法也是一样的——找到数组中特定元素的地址,然后进行解引用操作。 

2.指针数组

指针数组表示存放指针的数组,字面意思也就是一个数组中存放的不是某一个数或者字符,而是指针

通过一个例子来进一步掌握数组指针和指针数组

 

3.数组、指针参数

(1).一维数组参数的传递

一维数组传参有上面这几种

(2).二维数组传参

二维数组中数组名和一维数组中数组名的含义不一样。一维数组中,数组名代表首元素的地址,二维数组中数组名表示第一行的地址。如果用指针来接收这个地址的话,就该用指针数组来接受。

(3).一级指针传参

(4)二级指针传参

二级指针也就是操作一级指针的地址,在解引用的时候要加**

 4.函数指针

函数指针:保存函数地址的指针叫做函数指针,函数指针首先是一个指针,然后它指向函数。所以他的类型就是这样int(*)(int,int),指针p指向的函数为int型,有两个参数。

5.函数指针数组

函数指针数组:顾名思义就是一个数组中存放的全是函数指针类型的元素 

函数指针数组的作用:转移表 

下面通过写计算机程序的例子来理解函数指针的作用

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 exc(int a, int b)
{
	return (a / b);
}
int main()
{
//函数指针的作用:转移表
	int x, y;
	int input;
	int ret;
	do
	{
		printf("**************************************\n");
		printf("      1:add                  2:sub    \n");
		printf("      3:mul                  4:exc    \n");
		printf("**************************************\n");
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("输入操作数:");
			scanf("%d %d",&x,&y);
			ret = add(x,y);
			printf("ret = %d\n",ret);
			break;
		case 2:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = exc(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("选择错误\n");
			break;

		}
	} while (input);
	return 0;
}

上面是用switch语句写的计算机程序,看着是不是很冗余

下面用函数指针来实现

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 exc(int a, int b)
{
	return (a / b);
}
int main()
{
//函数指针实现计算机程序
	int x, y;
	int input;
	int ret;
	int (*p[5])(int x, int y) = {0,add,sub,mul,exc};		//定义一个函数指针数组,这里的函数里面的形参可以不写,但是类型一定要写
	do
	{
		printf("**************************************\n");
		printf("      1:add                  2:sub    \n");
		printf("      3:mul                  4:exc    \n");
		printf("**************************************\n");
		printf("请选择:");
		scanf("%d", &input);
		if (input <= 4 && input >= 1)
		{
			printf("请输入操作数:");
			scanf("%d %d",&x,&y);
			ret = (*p[input])(x, y);			//这里用ret接收函数指针数组传回来的值
			printf("%d\n",ret);
		}
	} while (input);
}

 

以上就是指针的详细类容 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼吐泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值