变量类型判断:变量和那个关键字结合,该变量就是什么类型;
1. 数组指针
定义 int ( * p)[n]; ; ( )优先级高,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][ ];
* 数组指针只是一个指针变量,他在内存中只占一个指针的存储空间;
2. 指针数组
定义 * p[n]; , [ ]的优先级高于 * ,p先和 [ ]结合,所以是一个指针数组,数组里面的元素是指针;
p+1,则p指向下一个数组元素,这样赋值是错误的;
p=a,因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。
*p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
* 指针数组是多个指针变量,占多个指针存储空间。
3. 函数指针
指向函数的指针变量,(函数名和对函数名取地址是一样的)
* int ( * pfun1) () ; ; pfun1先和 * 结合,说明pfun1是一个指针,指针指向一个函数,指向的函数无参数,返回值类型为 void ;
函数指针的用途:调用函数和做函数的参数;
函数指针的声明方法:返回类型 (标识符指针变量名)(形参列表)
代码1: (*(void(*)())0)();
分析这个代码:
- void(*)( )是一个函数指针类型,没有参数,没有返回值;
- 把常数0强制转化为返回值为void的函数的指针类型;
对0这个函数指针类型解引用得到函数;
使用typedef表述为:
typedef void (*funcptr)();
(*(funcptr)0)();
代码2:void(*signal(int, void(*)(int)))(int);
分析这个代码:- signal是个函数;
- signal有两个参数,第一个为int类型,第二个为函数指针;
- signal函数的返回类型是一个函数指针类型,该指针指向的函数有一个整形参数,参数返回为void;
4. 函数指针数组
函数指针数组是一个其元素是一个函数指针的数组;
函数指针数组声明:int (*funs[2])(int a,int b) ;funs先和[ ]结合,说明funs是一个数组,该数组有两个元素,每个元素都是函数指针类型;
* 使用函数指针数组实现 计算器;
#include<stdlib.h>
#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 dv(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,dv };
while (input)
{
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf("请选择:");
scanf_s("%d", &input);
if((input<5&&input>0))
{
printf("输入操作数:");
scanf_s("%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
{
printf("输入有误\n");
}
printf("ret=%d\n", ret);
}
system("pause");
return 0;
}
5.指向函数指针数组的指针
指向函数指针数组的指针是一个 指针,指针指向一个数组,数组的元素都是函数指针;
* char ( * ( * a)[4])(char *p) ; 这个指针指向包含了4个元素的数组;这个数组里面存的是指向函数的指针;这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。