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个整型元素的数组。这样的话我们将其解引用就得到了第一个一维数组,但是一维数组的名字又是首元素地址,所以我们再次解引用就得到了第一个一维数组的首元素,我们一次类推将其余元素打印出来。
我们来看看设想是否真确:
我们看到所有的元素都打印出来,所以我们的猜想的是对的。
2. 函数指针变量
我们之前学过数组指针所以函数指针也是指针,其实每个函数也有一个地址我们。
我们来看一串代码:
这样看来函数名就是函数的地址,我们的函数指针是啥呢?也就是用来存放函数地址的地方。
上述代码中我们使用了指针变量pt它的类型为int(*)(int x,int y),这个其实就是函数指针,int表示指向函数的返回类型,*告诉我们pt是个指针变量,(int x,int y )是指向的函数参数类型,其中x,y可省略不写(int ,int)即可。
我们有了函数的地址就可以通过解引用找到函数。然后进行函数调用。
演示如下:
我们通过解引用找到函数Add并且传参4,5,至Add函数,接收其返回值并打印出来。
3. typedef关键字
typedef是用来类型重命名的,可以将复杂的类型,简单化。比如,你觉得 unsigned int 写起来不方便,如果能写成 und_t 就方便多了,那么我们可以使用:
如果是指针类型,能否重命名呢?其实也是可以的,比如,将 int* 重命名为 ptr_t ,这样写:
但是对于数组指针和函数指针稍微有点区别:
比如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写:
在这里我们重定义的数组指针类型要将重定义的名称写在*右边。
函数指针类型的重命名也是一样的,比如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:
4.函数指针数组
顾名思义当然是数组了,上面我们学习了函数指针,那啥时函数指针数组呢?
其实就是函数指针的数组,我们来看一串代码:
我们创建了三个函数,它们的参数都是两个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);
}
在这个代码中我们就完成了简单的计算器模拟实现。