数组指针
数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
转自:http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html
函数指针
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名) (参数)
例如:
int (*hip)(int x, int y)
函数指针就是要把一个函数的地址赋给它,有如下两种写发,不过取地址运算符并不是必须的,因为一个函数的标识符就表示了它的地址。
hip = &hiphop();
hip = hiphop();
如果是函数调用,还需要一个括号括起来的参数表,它也有两种表示方法,个人建议用第一种,因为它可以清楚的表示是通过指针的方式来调用函数。
x = (*hiphop)();
x= hiphop();
示例
include <stdio.h>
void func1(void) // 定义一个函数,以方便下面定义函数指针
{
printf("test for function pointer.\n");
}
void (*pFunc)(void);//函数指针的定义
pFunc = func1; //函数指针赋值
(*pFunc)();//函数指针调用;用函数指针来调用以调用该函数
//func(); 调用的第二种写法,效果和上面一样
再例如,这样比较直观的理解函数指针
#include <stdio.h>
int Fouc()
{
printf("haha\n");
return 10;
}
int main()
{
int (*fouc)() = Fouc; //定义了一个函数指针fouc
printf("%p\n",fouc); //打印fouc指向的地址
// printf("%p\n",&fouc); 类似于数组,函数名和函数名取地址和函数名都是一样的
printf("%d\n",fouc()); //这是函数指针函数调用
printf("%p\n",Fouc);
printf("%d\n",Fouc());
}
得到的结果如下:
同样的还可以这样表示函数指针如下``
方式1
typedef int (* T)( );
T p = func;
方式2
int *p = func;
方式1定义了一个类型别名 T = int(*)();
函数指针数组重要应用场合 -----转移表
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 Menu()
{
printf("1,add\n");
printf("2,sub\n");
printf("3,mul\n");
printf("4,div\n");
int choice = 0;
scanf("%d",&choice);
return choice;
}
int main()
{
int num;
int choice = Menu();
// 这是一个通常的写法,这样的圈复杂度比较高
// if(choice == 1)
// {
// Add(10,20);
// }else if (choice == 2)
// {
// Sub(10,20);
// }else if(choice == 3)
// {
// Mul(10,20);
// }else if(choice == 4)
// {
// Div(10,20);
// }
// 可以使用表驱动的方法解决这个问题,即转移表
typedef int (* T)(int , int );
T arr[4]= {
Add,
Sub,
Mul,
Div
};
num = arr[choice - 1](10,20);
printf("%d",num);
}
不过转移表也有缺陷
1,必须适用于相同类型的函数,这样才能输入一个数组。
2.用户选择只能选择整数,如若是浮点型或其他就够呛了。
不过还好的是,以上示例的这样比较常用。