指针的深入了解5

1.二维数组传参本质

在此之前我们学习了一维数组传参,传的是它的首元素地址。那么二维数组也是这样的吗?

我们来看一串代码:

void print(int(*pt)[5])
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", *(*(pt + 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} };
	print(arr);
	return 0;
}

在上述代码中我们使用了数组指针,如果二维数组传参也是首元素地址的话,那就是第一个一维数组的地址,我们就用int(*pt)[5]来接收传参,pt表示指向一个有5个整型元素的数组。这样的话我们将其解引用就得到了第一个一维数组,但是一维数组的名字又是首元素地址,所以我们再次解引用就得到了第一个一维数组的首元素,我们一次类推将其余元素打印出来。

我们来看看设想是否真确:

指针的深入了解5_第1张图片

我们看到所有的元素都打印出来,所以我们的猜想的是对的。

2. 函数指针变量

我们之前学过数组指针所以函数指针也是指针,其实每个函数也有一个地址我们。

我们来看一串代码:

指针的深入了解5_第2张图片

 这样看来函数名就是函数的地址,我们的函数指针是啥呢?也就是用来存放函数地址的地方。

指针的深入了解5_第3张图片

上述代码中我们使用了指针变量pt它的类型为int(*)(int x,int y),这个其实就是函数指针,int表示指向函数的返回类型,*告诉我们pt是个指针变量,(int x,int y )是指向的函数参数类型,其中x,y可省略不写(int ,int)即可。

我们有了函数的地址就可以通过解引用找到函数。然后进行函数调用。

演示如下:

指针的深入了解5_第4张图片 我们通过解引用找到函数Add并且传参4,5,至Add函数,接收其返回值并打印出来。

3. typedef关键字

typedef是用来类型重命名的,可以将复杂的类型,简单化。比如,你觉得 unsigned int 写起来不方便,如果能写成 und_t 就方便多了,那么我们可以使用:

如果是指针类型,能否重命名呢?其实也是可以的,比如,将 int* 重命名为 ptr_t ,这样写:

但是对于数组指针和函数指针稍微有点区别:
比如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写: 

在这里我们重定义的数组指针类型要将重定义的名称写在*右边。

函数指针类型的重命名也是一样的,比如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:

4.函数指针数组 

顾名思义当然是数组了,上面我们学习了函数指针,那啥时函数指针数组呢?

其实就是函数指针的数组,我们来看一串代码:

指针的深入了解5_第5张图片

 我们创建了三个函数,它们的参数都是两个int类型,返回类型都为int,所以我们将它们是哪个函数的地址存入到函数指针数组中也就是int(*pt[3])(int x,int y),在这里int(*[3])(int x,int y)是类型。

在这里可以通过数组下标找到相应的函数进行运算,我们可以使用一个switch语句选择想要的的计算方法,就可以进行计算。

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;
}

void cals(int (*pt)(int, int))
{
	int x, y = 0;
	int ret = 0;
	printf("请输入两个操作数:");
	scanf("%d %d", &x, &y);
	ret = pt(x, y);
	printf("%d\n", ret);

}

int main()
{
	int input = 0;
	do

	{
		menu();
		printf("请选择:");
		scanf("%d", &input);

		switch (input)
		{

		case 1:
			cals(Add);

			break;
		case 2:
			cals(Sub);
			break;
		case 3:
			cals(Mul);
			break;
		case 4:
			cals(Div);
			break;
		case 0:
			printf("退出计算器");
			break;
		default:
			printf("输入错误,请重新输入");

		}


	} while (input);
}

在这个代码中我们就完成了简单的计算器模拟实现。

指针的深入了解5_第6张图片 谢谢

你可能感兴趣的:(c语言,开发语言)