函数指针,指针数组,数组指针,函数指针数组总结

一、函数指针

函数指针是指向函数的指针变量。

通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。

函数指针可以像一般函数一样,用于调用函数、传递参数。

typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

实例: 

int max(int x, int y)

{

return x > y ? x : y;

}

int main(void) { /* p 是函数指针 */

int (* p)(int, int) = & max; // &可以省略 int a, b, c, d;

printf("请输入三个数字:");

scanf("%d %d %d", & a, & b, & c); /* 与直接调用函数等价,d = max(max(a, b), c) */

d = p(p(a, b), c);

printf("最大的数字是: %d\n", d); return 0; } 

输出结果为:

请输入三个数字:1 2 3
最大的数字是: 3

二、指针数组

本质上还是一个数组,里面存放的是指针。

定义方式如下:

<存储类型> 数据类型 * 指针数组名[N]
int * p[5];
char *p1[6];

实例:

#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
   int  var[] = {10, 100, 200};
   int i, *ptr[MAX];
 
   for ( i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; /* 赋值为整数的地址 */
   }
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }
   return 0;
}

 结果如下:

Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200

三、数组指针

本质上还是一个指针,只不过指向的是整个数组。

定义方式如下:

<存储类型> <数据类型> (*变量名)[数组元素的个数]
 int a[9] = {1,2,3,4,5,6,7,8,9};
int (*p)[9] = &a;//int (*)[9]//p ==&a
(*p)[1];
int *q = a;

 实例:

typedef int arr[3]; 
int main() {     
   arr b = {1, 2, 3};     
   int (*a)[3] = &b;     
   arr *c = a;     
   for (int i = 0; i < 3; ++i) {         
      printf("%d\n", (*a)[i]);     
      
   } 
}
结果:

1 
2 
3

四、函数指针数组 

本质还是个数组,用来存放函数指针。

可以和函数指针对比一下:

void (*funcPointerArray[3])(double x);//函数指针数组
void (*funcPointer)(double x);//函数指针

实例:

#include <stdio.h>
 
void addItem(char *name)
{
	printf("Add %s successfully!\n",name);
}
 
void deleteItem(char *name)
{
	printf("Delete %s successfully!\n", name);
}
 
void findItem(char *name)
{
	printf("Find %s successfully!\n", name);
}
 
void updateItem(char *name)
{
	printf("Update %s successfully!\n", name);
}
 
void main()
{
	void(*funcPointerArray[4])(char *name);
	funcPointerArray[0] = addItem;
	funcPointerArray[1] = deleteItem;
	funcPointerArray[2] = findItem;
	funcPointerArray[3] = updateItem;
	printf("Please enter a number(0-3) to continue:");
	int num;
	scanf_s("%d", &num,1);
	printf("Please enter the name of the goods:");
	char buf[128];
	scanf_s("%s", &buf,128);
	funcPointerArray[num](buf);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值