目录
1.指针数组
2.数组指针
3.函数指针
4.函数指针数组
5.函数指针数组的指针
一、指针数组
1.是一个存放指针的数组
2.举一个栗子
int *arr[10];
char *arr2[4];
char **arr3[5];
二、数组指针
1.int (*p)[10];
解释:p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
注意:[ ]的优先级高于号,所以必须加上()来保证p先和结合。
2.举例
int arr[10] = {0};
int *p1 = arr;//数组首元素的地址
int (*p2)[10] = &arr; //数组的地址放在数组
3.一维数组传参
void test()
{
int arr[10]=0;
int *arr[20]=0;
print(arr);
print(arr2);
}
void print(int arr[])//对
{}
void print(int arr[10])//对
{}
void print(int *arr)//对
{}
void print(int *arr[20])//对
{}
void print(int **arr)//对
{}
4.二维数组传参
void test()
{
int arr[3][5]={0};
print(arr);
}
void print(int arr[3][5])//对
{}
void print(int arr[][5])//对
{}
void print(int (*arr)[5])//对
{}
void print(int arr[][])//错
{}
void print(int* arr[5])//错
{}
void print(int *arr)//错
{}
void print(int **arr)//错
{}
三、函数指针
1.存放函数地址的指针
void test()
{
printf("hehe\n");
}
void (*ptest)()=test;//函数指针,存放test函数的地址
//ptest先和*结合,说明ptest是指针,指针指向的是一个函数,执行的函数无参数,返回值类型为void1
2.代码1 ((void ()( )0))();
解释:void (*)( )是一个函数指针,把0强制类型转换成函数指针,整个代码的意思是调用0地址出的函数。
代码2 void (signal(int,void()(int)))(int);
解释:1. signal是一个函数声明
2. signal函数的参数有2个,第一个是int,
第二个是函数指针,该函数指针能够指向的函数有一个int参数, 返回类型为void
3. signal函数的返回类型为函数指针,该函数指针能够指向的函数有一个int参数,
返回类型为void。
简化代码2
typedef void(*pfun_t)(int);//pfun_t是类型名
pfun_t signal(int,pfun_t);1
四、函数指针数组
1.把函数的地址存到一个数组中,这个数组就叫函数指针数组。
int *arr[10];//指针数组
int (*parr1[10])();//函数指针数组
//parr1先和[ ]结合,说明parr1是数组,数组的内容是int (*)()类型的指针1
2.用途:转移表
例如:计算器
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;
}
int main()
{
int (*p )(int, int) = Add;
int (*p1[4])(int, int) = {Add, Su b, Mul, Div};//函数指针数组
return 0;
}
五、指向函数指针数组的指针
1.是一个指针,指针指向一个数组,数组的元素都是函数指针。
2.定义
int (*p )(int, int) = Add;//函数指针
int (*p1[4])(int, int) = {Add, Su b, Mul, Div};//函数指针的数组p1
int (*(*p2)[4])(int, int) =&p;//指向函数指针数组p1的指针p2