指针与一维数组:
int arr[5];
int *p = arr; arr == &arr == &(arr+0) == &arr[0]
一维数组名其实就是数组首元素的地址
数组名和普通的指针的区别在于 数组名不能作为左值
p[1] = = *(p+1) == arr[1] == *(arr+1)
&arr 数组的地址
&arr 和 arr 值相同 但类型不同
arr+1 偏移了一个数组元素的长度
&arr+1 偏移了整个数组的长度
int (*parr)[5] = &arr;
数组指针: 本质是一个指针 该指针指向一个数组
T (pname)[n];
数组指针pname指向一个一维数组 数组长度为n 数组中存储的元素类型为T
指针数组: 本质是一个数组 数组中的元素为指针
T * arr[n]; 数组中所有元素的类型为 T
二维数组与指针:
int arr[3][4] = {};
int (*parr)[4] = arr == &*arr == &*(arr+0) == &arr[0]
parr == arr == &arr[0]
*parr == *arr == *&arr[0] == arr[0] == &arr[0][0]
**parr == **arr == *arr[0] == arr[0][0]
int *p = arr[0] == &*arr[0] == &*(arr[0]+0) == &arr[0][0]
*(*(arr+1)+2) === arr[1][2]
int (*pa)[3][4] = &arr;
函数与指针:
函数名即内存地址
函数指针: 本质是指针 该指针指向一个函数
T (*pname)(ARGS,...);
函数指针pname 指向一个函数 该函数返回值类型为T,参数为ARGS
int * func(int *p){}
int * (*pf)(int *); //pf是一个函数指针变量
pf = func;
int a = 0;
pf(&a); //调用函数
指针函数: 本质是函数 函数返回一个指针类型
定义一个指针函数指针数组变量: T* (*parr[n])(...)