知识杂谈

指针

1、指针数组和数组指针

例: int arr[10]; int array[3][10];
int *ptr[10]; 				//ptr是含有10个int *指针的数组
int (*pArray)[10] = &arr;	//pArray指向一个含有10个整数的数组
int (&arrRef)[10] = arr;	//arrRef引用一个含有10个整数的数组

数组指针一般给二维数组使用,例如:

int (*pArray)[10] = array;
则*pArray是array[0][0]的地址,*pArray+1是array[0][1]的地址,
*(pArray+1)是array[1][0]的地址,*(*(pArray+1)+3)是array[1][3]的值

返回数组指针的函数:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或引用

Type (*func(parameter_list))[dimension];

其中,Type代表元素类型,parameter_list为参数,dimension为数组大小,例如:

int (*func(int i))[10];

实例如下:

int (*getCopyArr(int (&arr)[10]))[10]
{
	int (*n)[10] = (int (*)[10]) new int [10];
	for(int i = 0; i < 10; i++)
	{
		(*n)[i] = arr[i];
	}
	return n;
}
//note:该函数返回了分配在堆的数组,如果得到该数组后没有释放内存,会导致内存泄漏,这里仅仅作为示例不考虑该问题

2、函数指针数组和指向函数指针数组的指针

int (*arr1)();				//函数指针
int (*arr2[10])();  		//定义一个数组,数组的内容均是指向函数的指针
当定义了一个函数指针数组后,能否在定义一个指针用于保存这个数组的地址呢?这个指针就是指向函数指针数组的指针。其表达式为
int (*(*p)[10])(int *);		//声明一个指向10个元素数组的指针,其中每一个元素是一个函数指针,函数返回值是int,参数是int *

使用实例如下:
1、函数指针数组的使用

int (*a[10])(int);
int fun(int x) {return x*x};
a[0] = fun;
printf("%d\n", a[0](5));

2、指向函数指针数组的指针

int fun(int *a)
{
	cout << *a << endl;
	return *a;
}

int main()
{
	int t= 10;
	int (*(*p)[10])(int *);
	int (*arr[10])(int *);
	p = &arr;
	for(int i = 0; i < 10; i++)
	{
		(*p)[i] = &fun;
		(*p)[i](&t);
	}
}

函数指针数组实例
头文件:

#pragma once
#include <stdio.h>

typedef int(*PFUN)(int x, int y);

int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int myDiv(int x, int y);
void menu(void);
void calc(PFUN pFun);
void calcTest(void);

源文件:

#include "calc.h"

int add(int x, int y)
{
	return (x + y);
}

int sub(int x, int y)
{
	return (x - y);
}

int mul(int x, int y)
{
	return (x * y);
}

int myDiv(int x, int y)
{
	return (x / y);
}

void menu(void)
{
	printf("******************************\n");
	printf("**     1. add     2. sub    **\n");
	printf("**     3. mul     4. div    **\n");
	printf("**          0.exit          **\n");
	printf("******************************\n");
}

void calc(PFUN pFun)
{
	int x = 0, y = 0;
	int res = 0;
	printf("请输入要进行计算的值: ");
	scanf_s("%d, %d", &x, &y);		//这里scanf的输入方式固定为:数字,数字
	res = pFun(x, y);
	printf("计算结果是: %d\n", res);
}

void calcTest(void)
{
	int input = 0;
	PFUN pFunc[5] = { NULL, add, sub, mul, myDiv };
	char ch[][10] = { "加法", "减法", "乘法", "除法" };
	do {
		menu();
		printf("请选择:");
		scanf_s("%d", &input);
		if (1 <= input && input <= 4)
		{
			printf("当前使用的是: %s\n", ch[input - 1]);
			calc(pFunc[input]);
		}
		else if (input == 0)
		{
			printf("退出\n");
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	} while (input);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值