理解:指针数组/数组指针/ 函数指针/ 函数指针数组/ 指向函数指针数组的指针
一、指针数组与数组指针
1.指针数组:是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。
例如:int *p[3]
2.数组指针:是一个指针,指向了一个数组。
例如:int (*p)[3]
这其中涉及到了符号的优先级问题:“[ ]”的优先级高于“*”,所以p先和谁结合就表示谁。"int *p[3]" p先和[ ]结合,所以是数组,数组元素为 int * 型;"int (*p)[3]" “()”的优先级高于“[ ]”,p先和“*”结合,所以是指针,该指针指向 int 型数组的内容.
二、函数指针,函数指针数组.
1.函数指针:函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象。
例如:void (*funcPointer)(double x);
具体用法如下:
void (*funcPointer)(double x);
void f1(double x){}
funcPointer=f1;
funcPointer是指针变量,它指向一个函数。这个函数有一个double类型的参数,返回值为 void * 型.
总的来说,函数指针就是指向函数体第一行可执行语句的一个指针。
2.函数指针数组:存储函数指针的数组。
例如:void (*funcPointerArray[3])(double x);
具体用法如下:
以上5.6.7.又可以写为:void (*funcPointerArray[3])(double x) = {f1,f2,f3}
三、函数指针数组,函数指针数组指针.
1.函数指针数组:首先它是一个数组,数组元素为函数指针。
例如:char *(* a[4])(char *p);它是一个数组,数组名为 a ,数组内有四个指向函数的指针;
这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。
2.函数指针数组指针:首先它是一个指针,这个指针指向数组,这个数组里面存的都是指向函数的指针。
例如:char (*(* a)[4])(char *p); 这个指针指向包含了4个元素的数组;
这个数组里面存的是指向函数的指针;
这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。
3.函数指针数组的实现:计算器.
- #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);
- }
- else
- printf( "输入有误\n" );
- printf( "ret = %d\n", ret);
- }
- return 0;
- }
- 运行结果: