指针数组
定义
指针数组是数组,是一个存放指针的数组
指针数组有
整形指针数组
int *arr[10];
存放整型指针的数组
字符型指针数组
int i=0;
char *arr[]={"good","hello","world"};
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%s ",arr[i]);
}
字符型指针数组每一个元素存放字符型指针,该指针指向每一个字符串的首地址。
数组指针
定义
我们已经知道,int *p; 整型指针是能够指向整型的指针;char *p;字符指针是能够指向字符的指针,那么数组指针就是能够指向数组的指针,数组指针是指针
int (*p)[10];//p先和*结合,说明p是一个指针变量,指针指向的是一个大小为10的整形数组,所以p是一个指针指向的是一个数组,p叫数组指针
如果*p不带括号呢?
int *p[10]//由于[]的优先级是高于*的,可以知道这是一个指针数组
所以二者有类型的差异
数组指针的使用
int arr[10]={0};
int (*p)[10]=&arr;
p是数组指针存放的是数组arr的地址
函数指针
定义
函数指针是指向函数的指针变量,也可以理解为存放函数地址的指针,声明如下
int (*p)(int);
p先和*结合说明p是指针,指针指向的是一个函数,这个函数的参数是int,返回值类型为int
函数指针的两个用途
1:调用函数
#define _CRT_SECURE_NO_WARNINGS 11
#include<stdio.h>
#include<stdlib.h>
int ADD(int a, int b)
{
return a + b;
}
int main()
{
int(*p)(int, int) = 0;
int a = 2;
int b = 3;
int ret = 0;
p = ADD;
ret = (*p)(a, b);
printf("%d\n", ret);
system("pause");
return 0;
}
2:做函数的参数
void (*signal(int,void(*)(int)))(int);
解释:1>signal是一次函数声明
2>signal 函数的第一个参数是int,第二个参数是函数指针void (*)(int),这个函数指针指向的函数参数为int,返回值为void
3>signal函数的返回类型为一个函数指针,改函数的指针指向的函数参数为int,返回值为void
函数指针数组
定义
把函数的地址存到一个数组中,这个数组就叫做函数指针数组
int (*p[10])();
p先和[]结合,说明p是数组,数组的内容是int(*)()的指针
用途
使用函数指针数组实现一个计算器
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int Div(int x, int y)
{
return x / y;
}
int mul(int x, int y)
{
return x*y;
}
int sub(int x, int y)
{
return x - y;
}
int add(int x, int y)
{
return x + y;
}
int main()
{
int x = 0;
int y = 0;
int ret = 0;
int input = 1;
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("请选择:\n");
scanf("%d", &input);
if (input > 0 && input < 5)
{
printf("请输入两个操作数:\n");
scanf("%d%d", &x, &y);
ret = (*p[input])(x, y);
printf("%d\n", ret);
}
else
{
printf("输入有误\n");
}
}
system("pause");
return 0;
}
#指向函数指针数组的指针
定义
指针指向一个数组,这个数组的元素都是函数指针
void test(const char *str)
{
printf("%s\n",str);
int main()
{
//函数指针p
void (*p)(const char*)=test;
//函数指针的数组pArr
void (*pArr[5])(const char* str);
//指向函数指针数组的指针pp
void (*(*pp)[10])(const char*)=&pArr;
return 0;
}