深度理解数组指针,指针数组等

本文深入解析了指针数组、数组指针、函数指针及其数组的概念与应用,包括定义、使用方法及示例代码,展示了如何利用函数指针实现计算器功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针数组

定义

指针数组是数组,是一个存放指针的数组

指针数组有

整形指针数组

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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值