指针数组
所谓指针数组实际上是一个数组,但和普通数组的区别是,普通数组存放的是整形或字符型,而指针数组是一个存放指针的数组。
举例:int *arr[10];
数组指针
和指针数组类似的是,都是由指针和数组组成的,但两者有着本质的区别。
指针数组是一个数组,而数组指针是一个指针,主要应用于二级指针的访问。
在声明一个数组时,它同时也分配了一些内存空间,用于容纳数组元素。但是在声明一个指针时,它只分配了用于容纳指针本身的空间。
来看一个简单的数组指针的定义:
int (*p)[10]; //这里p先和*结合,表明是一个指针变量,然后再指向一个大小为10的整形数组。所以p是一个指针,指向一个数组,是一个数组指针。
测试用例:
#include<stdio.h>
int main()
{
int arr[10] = {0};
printf("%p\n",arr); //表示数组首元素的地址
printf("%p\n",arr+1); //表示数组的地址
printf("%p\n",&arr);
printf("%p\n",&arr+1);
return 0;
}
函数指针
其本质是一个指针变量,是一个指向函数的指针。
测试用例:
#include<stdio.h>
void test()
{
printf("hello world!");
}
int main()
{
printf("%p\n",test);
printf("%p\n",&test);
return 0;
}
从得到的结果可以看出,打印出来的两个地址是test函数
的地址。
在对函数指针有了简单了解后,来看两段有意思的代码。
//代码1
(*(void(*)())0)();
//代码2
void (*signal(int, void(*)(int)))(int);
代码分析:
代码1:首先它是一个函数调用,调用的是0地址处的无参的返回类型为void
的函数。
代码2:它是一个函数声明。函数名为signal
,它有两个参数(int, void(*)(int)),后一个参数是一个函数指针,指向一个函数参数为int,返回类型为int的函数
,返回类型为void (*)(int)
。
函数指针数组
数组是一个存放相同类型数据的存储空间,把函数的地址存放在一个数组中,这个数组就叫做函数指针数组。
简单举例:int (*arr[10])();
,arr
先和 [] 结合,说明arr
是一个数组,数组的内容是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 = 0;
int y = 0;
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("ret = %d\n", ret);
}
else
{
printf("输入有误!\n");
}
return 0;
}
}
指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素是函数指针。
简单例子分析:
void(*signal(int, void(*)int))(int);//函数的声明
void(*signal(int a, void(*pFun)(int)))(int)//函数的定义
{
return NULL;
}
void (*signal(int, void(*)(int)))(int);
,它是一个函数声明。函数名为signal
,它有两个参数(int, void(*)(int)),后一个参数是一个函数指针,指向一个函数参数为int,返回类型为int的函数
,返回类型为void (*)(int)
。
以上是对这些概念的简单理解,欢迎指正交流。