数组指针:
数组指针是一个指针,指向一个数组。
指针就是地址
int (*p)[10];
//[]的优先级高于 *,所以必须加上()保证p 与 *先结合
解释:p与*先结合,说明p是一个指针变量,指向一个数组,叫数组指针。
指针数组
指针数组是一个存放指针的数组
创建一个数组相当于在内存中开辟一块连续的空间,
int arr[2]就是开辟了一个大小为2*sizeof(int)字节的空间。
二维数组相当于特殊的一维数组。
(谁先结合就是什么类型,类型写在最后面)
函数指针
void(* pfun1)();pfun1先和 *结合,说明pfun1是一个指针,指向无参数的函数,返回值类型为void。
函数指针是指向函数的指针变量。 因此”函数指针”本身首先应是指针变量,
只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样
函数指针数组
int (*parr1[10])();
parr1先和[]结合,说明parr1是数组,数组内容是int(*)()类型的函数指针
函数指针数组的用途:转移表
函数指针数组:是一个数组,数组之中存放着函数指针(指向函数的指针)
#include<stdio.h>
#pragma warning (disable:4996)
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;
}
void menu() //打印菜单
{
printf("--------------------\n");
printf("****1add 2sub ****\n");
printf("****3mul 4div ****\n");
printf("--------------------\n");
}
int main()
{
int input = 1;
int i = 0;
int x, y;
int ret = 0;
int(*p[6])(int x, int y) = { 0, add, sub, mul, div }; //转移表(指针数组)
while (input) //循环条件
{
menu(); //显示菜单
printf("请输入你的选择->\n");
printf("----------------\n");
scanf("%d", &input);
if ((input<5 && input>0)) /
{
printf("请输入操作数->\n");
scanf("%d%d", &x, &y);
ret = (p[input])(x, y);
}
else
{
printf("输入有误\n");
}
printf("ret=%d\n", ret); //打印输出结果
}
return 0;
}
函数指针数组的指针
是一个指针,指向一个数组,数组的元素都是函数指针。
如 void (*(*p)[ 5]) )( void) 这样的形式它表示 一个指向有5个元素 每个元素为指向一个返回值为空的函数 的数组的这样一个指针 。