指针
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);
}