指针数组
数组指针
函数指针
函数指针数组
指向函数指针数组的指针
首先说一些题外知识:
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这里的数组名表示整个数组
&数组名,这里的数组名表示整个数组。取出的是整个数组的地址。
指针数组
概念:指针数组是数组,是一个存放指针的数组
int *arr1[10];
char *arr2[4];
char **arr3[5];
先和[ ]结合再与*结合,所以首先他是一个数组,其次数组每个单元的类型是指针,所以称为指针数组。
数组指针
概念:数组指针是指针。
int (*p)[10];
p先和*结合,说明p是一个指针变量,然后指真指向的是一个大小为10个整型的数组。所以p是一个指真,指向一个数组,叫数组指针。
注意:[ ]的优先级要高于,所以必须加上()来保证p先和 结合。
int (*p)[10] = &arr;
p是数组指针,所以存放数组的地址是合适的。
二维数组传参
void test()
{
int arr[3][5] = {0};
print(arr);
}
void print(int arr[3][5])//ok
{ }
void print(int arr[][5])//ok
{ }
void print(int (*arr)[5])//ok
{ }
void print(int **arr)//不可以arr传过来的地址是数组的地址(数组第一行的地址)不能放在二级指针中,可以放在数组指针中。
{ }int arr[5];//整型数组
int *parr1[10];//指针数组
int (parr2)[10];//数组指针,不可以将第一个arr的地址放在parr2中,因为一个类型为int [5],另一个类型为int [10].也不可以将parr1的地址放在parr2中,两个类型不用一个是int [10],另一个是int [10];
int (*parr3[10])[5];//存放数组指针的数组
函数指针数组:把函数的地址存放到一个数组中,那这个数组就叫做函数指针数组
int (*parr1[10]) ();
parr1 先和[ ]结合,说明parr1是数组,数组的内容是int (*) ( )类型的函数指针。
函数指针数组的用途:转移表
例如:(计算器)
#include<stdio.h>
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 div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0,add,sub,mul,div };
while (input)
{
printf("******************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf("******************************\n");
printf("请选择:");
scanf("%d", &input);
if (input <= 4 && input >= 1)
{
printf("请输入操作数:");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
printf("%d\n", ret);
}
else
printf("输入有误\n");
}
return 0;
}
指向函数指针数组的指针
概念:首先它是一个指针,指针指向一个数组,数组的元素都是函数指针;
定义:
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
void(*pfun)(const char*) = test;//函数指针
void(*pfunArr[5])(const char*);//函数指针数组
pfunArr[0] = test;
void(*(*pfunArr[5]))(const char*) = &pfunArr;//指向函数指针数组的指针
return 0;
}