1.数组指针
定义:数组指针,是指向数组地址的指针,其本质为指针。
例:int (*p)[10];
括号的优先级大,故先执行间接访问(*),所以p是一个指针;
接下来执行下标操作,所以p指向某种类型的数组,由int知数组的每个元素都是整数。
2.函数指针
先看一段代码:
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
输出的是两个地址,这两个地址是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?
看下面的一段代码:
void test()
{
printf("hehe\n");
}
void (*pfun1)();
pfun1先和*结合,说明pfun1是指针,
指针指向的是一个函数,指向的函数无参数,返回值类型为void。
3.函数指针数组
定义:要把函数的地址存到一个数组中,那这个数组就叫函数指针数组
int (parr1[10]])();
对于这个函数而言,parr1先和[ ]结合,说明parr1是一个数组,
而数组的内容是int()()类型的函数指针。
例如:转移表
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;
}
4.理解指向函数指针数组的指针和定义
指向函数指针数组的指针是一个指针指针指向的是一个数组,数组中的元素都是函数指针。
例题:
char* test1(int a,int *b)
{
return = NULL;
}
char* test2(int a,int *b)
{
return = NULL;
}
int main()
{
//函数指针
char *(*p1)(int , int *) = test1;
//函数指针数组
char *(*p2[2])(int , int *) = {test1,test2};
//指向函数指针数组的指针
char *(*(*p3)[2])(int , int *) = &p2;
return 0;
}
本文详细解析了C语言中的数组指针、函数指针及函数指针数组的概念,通过实例展示了如何使用这些指针进行复杂的数据操作和函数调用,为读者提供了深入理解指针机制的途径。

被折叠的 条评论
为什么被折叠?



