对指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针的理解

1、指针数组
指针数组是存放指针的数组

int *arr[5] //整型指针数组,表示数组的每个元素的类型都是int*
char *arr[5] //字符型指针数组,数组的每个元素的类型都是char*
char **arr[5] //二级指针数组 每个元素的类型都是char**

2、数组指针是一种指针,存放数组地址的指针,不是存放字符指针、整型指针的

int *p = arr;  //p是一个指针变量,p中存放的是数组首元素的地址。
int (*p)[10] = &arr;  //存放整个数组的地址,*表示p是一个指针变量,指向的是一个大小为10的整型数组。

数组首元素的地址和整个数组的地址值是一样的,但它们的类型不相同。
例如:

&arr+1; //代表找到该数组地址的下一段地址。
arr[0]+1; //代表arr[1]

(1) 用指针变量arr组 *(arr[0]+1) 表示对数组首元素的地址解引用,即就是访问数组首元素arr[0]
(2)用指针访问二维数组

int arr[3][5] = {1,2,3,4,5,6,7,8,9,0};
int (*p)[5] = arr; //存放第一行数组的地址
//*(*(p+i)+j)等同于arr[i][j];p+i拿出数组第i行的地址,解引用访问数组第i行,*(p+i)+j拿到第i行第j列的地址,再解引用访问该书组的第i行第j列

(3)深入理解
int (arr[10])[5] //为一个数组,]优先级高于,明这是一个指针数组,数组中有10个指针,每个元素是一个数组指针,个指针指向5个整型元素的数组,的类型为int(*)[5]。
3、函数指针//指向函数地址的指针

void(*arr)()  //arr是一个指向函数的指针,函数没有参数,返回空类型
arr = test; //是把test的函数的地址存放在指针变量arr中
(*arr)(); //对test函数的调用

4、函数指针数组
等于将函数指针的指针换为指针数组,这样数组中可以存放多个函数的地址,调用某个函数很方便
5、指向函数指针数组的指针
是一个指针,直线函数指针数组。

int (*arr[5])(int ,int)={NULL,Add,Sub,Mul,Div};
int (*(*p)[5])(int ,int )=&arr //p先和*结合,是一个指向函数指针数组的指针变量,p中存放的是整个数组的地址
(*p)[1](1,2) //表示访问数组的下标为1的元素Add,然后调用Add函数,数为1和2

猜你喜欢

转载自blog.csdn.net/c1029323236/article/details/80326611