指针数组
定义: 指针数组是数组,是一个存放指针的数组。
//下面哪个你认为是指针数组?
int *arr1[10]; //这里[]的优先级高于*的,所以arr1
//先于[]结合,所以这是一个数组,数组里面存的是int *类型
char *arr1[4]; //也是一个指针数组,存的是char *类型数据
char **arr3[5]; //也是一个指针数组,存放的
// 是 char **(char型指针的地址)
数组指针
定义:存数组的地址的指针
//概念分析
//数组指针,是指针
//我们已经熟悉:
//整形指针:int *pint 能够指向整形数据的指针
//浮点型指针:float * pf;能够指向浮点型数据的指针
//那数组指针是什么呢?指针?数组?
//例如:
int *p[10]; //这是一个指针数组
int (*p)[10]; //这是一个数组指针,定义一个容量为10的数组的指针
//数组指针语法规定名字写在中间
//指针的类型是 type+*
int(*p)[10] ,int[10]相当于type
eg:
int a[10];
int (*p)[10] = a;
printf("%p\n",p);
printf("%p\n",p+1);//输出结果比上一行大40;
//指针+1是加上其所指类型的大小,这个指针是一个int[10]
//的指针,这个类型占40个字节。
int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10个整形
//的数组。所以p是一个指针,指向一个数组,叫数组指针。
函数指针
- 定义:函数指针就是存函数地址的指针。
下面pfun1和pfun2哪个有能力存放test函数的地址?
void test()
{
printf("hehe\n");
}
void (*pfun1)(); //可以,函数的指针
void *pfun2(); //不行,函数的声明
void fun(int (*a)[5])
{
;
}
int main()
{
int a[10][5];
void(*p)(int(*)[5]) = fun; //(想?)
fun(a); //数组传参降级为指向内部元素类型的指针,这个数组的
//内部元素是一个数组,是一个int [5]的数组
}
函数指针数组
- 定义:把函数的地址存放到一个数组中。
int (*parr1[10])(); //函数指针数组
//这是一个定义与使用函数指针数组的过程
#include <stdio.h>
void box(int * x)
{
printf("%d\n",*(x+1));
}
void box1(int *x)
{
printf("%d\n",*(x+1));
}
void box2(int * x)
{
printf("%d\n",*(x+1));
}
int main()
{
int a[] = {1,2,3,4,5,6};
int b[] = {11,22,33,44,55,66};
int c[] = {111,222,333,444,555,666};
void (*arr[])(int * x) = {box,box1,box2};
arr[0](a);//输出的是函数指针数组的第一个元素对应的函数
//,参数是a数组结果为2
return 0;
}
指向函数指针数组的指针
指向函数指针数组的指针是一个指针
指针指向一个数组,数组的元素都是函数指针
#include <stdio.h>
void box(int * x)
{
printf("%d\n",*(x+1));
}
void box1(int *x)
{
printf("%d\n",*(x+1));
}
int main()
{
void (*arr[2])(int *) = {box,box1}; //函数指针数组,数组元素都是函数指针的数组
void (*(*tt)[2])(int *) = &arr; //存放的是函数指针数组的地址
printf("%p\n",arr);
printf("%p\n",tt);
return 0;
}
void test(const char *str)
{
printf("%s\n",str);
}
int main()
{
void (*pfun)(const char *) = test;//函数指针pfun
void (*pfunArr[5])(const char * str);//函数指针的数组pfunArr
void (*(*ppfunArr)[10])(const char *) = &pfunArr;
//指向函数指针数组pfunArr的指针ppfunArr
pfunArr[0] = test;
return 0;
}