一、指针数组
含义:它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
比如:int * p1[8];这是一个数组,其包含8 个指向int 类型数据的指针,即指针数组。int *修饰数组的元素。
二、数组指针
含义:它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节, 不能直接得出它指向的数组占多少字节。它 是“指向数组的指针”的简称。
比如:int (*p2)[10];p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。int 修饰数组的内容。
使用举例:int(*p)[10];p先和*结合,说明p是一个指针变量,然后接着指向的是一个大小为10个整形的数组。所以p是一个指针,指向一个数组,叫数组指针。
void print(int(*arr)[5];//二维数组传参
值得注意的是:[]的优先级要高于*号的,所以必须不加上()来保证P先和*结合。p的类型由p两侧符号的优先级决定。
三、函数指针
含义:函数指针就是函数的指针。它是一个指针,指向一个函数。
比如:void (*pfun1)();pfun是一个指针变量,它指向一个函数,这个函数没有参数,函数的返回值为一个空类。
使用举例:下面pfun1和pfun2哪个有能力存放test函数的地址?!
void ( * pfun1 )( ) void *pfun2( )
答案肯定是pfun1,。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。 下面阅读两个有趣的代码:
代码1)( * ( void ( * ) ( ) ) 0 ) ( )
分析:这是一个函数调用,把0强制转换为函数指针类型,把0号地址里连续的4个字节的的内容拿出来,返回值为void。
代码2) void ( * signal ( int ,void ( * ) ( int ) ) ) ( int );
分析:将代码2)进行简化:typedef void ( *pfun_t )( int )
pfun_t signal ( int, pfun_t )
signal是个函数,参数分别为括号中的int和void(*)(int),返回值为void*int。括号中的void(*)(int)是个函数指针,返回值为void*int。
四、函数指针数组
含义:把函数的地址存到一个数组中,那这个数组就叫函数指针数组。
比如:char * (*pf[3])(char *p);它是一个数组,数组名为pf,数组内存储了3 个指向函数的指针。这些指针指向一些返 回值类型为指向字符的指针、参数为一个指向字符的指针的函数。
函数指针的用途:转移表
例子:(计算器)
#include<stdio.h>
#include<windows.h>
#pragma warning (disable:4996)
int my_add(int x, int y)
{
return x + y;
}
int my_sub(int x, int y)
{
return x - y;
}
int my_mul(int x, int y)
{
return x*y;
}
int my_div(int x, int y)
{
if (y == 0)
{
printf("div zero!error!\n");
return -1;
}
return x / y;
}
void menu()
{
printf("************************\n");
printf("***1.add 2.sub***\n");
printf("***3.mul 4.div***\n");
printf("*** 0.quit***\n");
printf("************************\n");
printf("Please select: ");
}
int main()
{
int(*p[4])(int, int) = { my_add, my_sub, my_mul, my_div };
int select;
do{
menu();
scanf("%d", &select);
if (select >= 1 && select <= 4)
{
int x;
int y;
printf("Please Enter Your Data For Cal<x,y>: ");
scanf("%d%d", &x, &y);
int res = p[select - 1](x, y);//函数调用,p是数组
printf("Result:%d\n", res);
}
else if (select == 0)
{
printf("over!\n");
break;
}
else
{
printf("You Enter Select Error[1,4]\n");
}
} while (1);
system("pause");
return 0;
}
显示结果:
五、指向函数指针数组的指针
含义:指向函数指针数组的指针是.一个指针,指针指向.一个数组,数组的元素都是函数指针。
比如:char * ((*pf)[3])(char p); pf 是指针。这个指针指向一个包含了3 个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。
使用举例:
void test(const char *str)
{
printf("%s\n", str);
}
int main()
{
void(*pfun)(const char*)=test;//函数指针pfun
void(*pfunArr[5])(const char*str);//函数指针的数组pfunArr
pfunArr[0] = test;
void(*(*ppfunArr)[10])(const char*);//指向函数指针数组pfunArr的指针ppfunArr
return 0;
}