C语言——指针数组,数组指针,函数指针,函数指针数组

C语言——指针数组,数组指针,函数指针,函数指针数组

众所周知,指针是一个地址,也是用于存储数据地址,通常说的指针是一个指针变量。在内存中,指针在32(x86)位系统中占用4个字节,在64位系统中是占用8个字节。学习C语言不可避免的会使用指针,比如我们常常说的函数调用的方式:传址调用,传值调用。其中的传址调用,用于接收数据的就是指针。

指针数组

指针数组——用于存放指针的数组

如:

char *p1="hello!";
char *p2="world";
char *arrp[10]={p1,p2};

此时的arrp就是指针数组,含义就是可以存放10个char*指针。当你要使用其中的指针时,可以直接使用下标的方法。因为是数组,只能存放相同类型的指针。

数组指针

数组指针——一个指向数组的指针。

如:

int arr[10]={1,2,3,4,5,6,7,8,9,10};
int(*p)[10]=&arr;

此时的p就是数组指针,他也可以用于打印数组每个数据。

int arr[]={1,2,3,4,5,6,7,8,9,10};
int(*p)[10]=&arr;//数组指针
int sz=sizeof(arr)/sizof(arr[0]);
int i=0;
for(i=0;i<sz;i++)
{
    printf("%d ",(*p)[i]);//此时的p是整个数组
}

还有很多可以使用数组指针的项目,数组传参可以利用数组指针。

函数指针

函数指针——一个指向函数的指针

如:

int Add(int x,int y)
{
    return x+y;
}
int main()
{
    int *p(int ,int)=&Add;
    int *p1(int x,int y)=Add;
    printf("%d\n",p(3,5));
    return 0;
}

在以上的函数中 p 等价于 p1 都是函数指针,他们括号里的参数可以省略,参数类型不能省略!函数名和取地址函数名是一样的,所以在函数前加不加取地址符号&也可以同样代表函数地址。

函数指针数组

函数指针数组——用于存储函数指针的数组

如;

函数指针——一个指向函数的指针

如:
int Add(int x,int y)
{
    return x+y;
}
int Sub(int x,int y)
{
    return x-y;
}
int main()
{
    int *p(int ,int)=&add;
    int *p1(int ,int)=&Sub;
  	int(*parr[2])(int ,int)={p,p1};
    return 0;
}

parr 就是函数指针数组,当去掉parr 时int(*)(int ,int),就是该数组的类型,返回型是int。可以利用函数指针数组来实现一个简易计算机,包括,加,减,乘,除,左移位,右移位,按位与,按位或,按位异或,这9种运算。

//action
#include<stdio.h>
void menu()
{
	printf("-------------------------\n");
	printf("|   0.退出    1.加      |\n");
	printf("|   2.减      3.乘      |\n");
	printf("|   4.除      5.左位移  |\n");
	printf("|   6.右位移  7.按位与  |\n");
	printf("|   8.按位或  9.按位异或|\n");
	printf("----------------------\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sex(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x,int y)
{
	return x / y;
}
int left(int x, int y)
{
	return x << y;
}
int right(int x, int y)
{
	return x >> y;
}
int move_and(int x, int y)
{
	return x | y;
}
int move_or(int x, int y)
{
	return x & y;
}
int and_or(int x, int y)
{
	return x ^ y;
}
int main()
{
	int input = 0;
	do {
		menu();
		printf("please input way:>");
		scanf("%d", &input);
		int(*parr[10])(int, int) = { 0, Add, Sex, Mul, Div, left, right, move_and, move_or, and_or };
		if (input == 0)
		{
			printf("退出\n");
			break;
		}
		else if (input >= 1 && input < 10)
		{
			printf("请输入两个操作数:>");
			int x = 0;
			int y = 0;
			scanf("%d %d", &x, &y);
			printf("%d\n", (*parr[input])(x, y));
		}
		else
			printf("输入错误\n");
	} while (input);
	return 0;
}

今天的分享就到这里,其实使用函数指针数组的方法有很多,值得你一一去探索。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值