1.数组的四种访问方式
定义数组 a[]; 指针 *p 指向数组a;
(1) 利用数组的下表进行访问 a[i];
(2) 数组名+地址的偏移量i *(a+i)
(3) 利用指针 p 进行下表访问 p[i]
(4) 指针p + 地址的偏移量i *(p+i)
一维数组数组名:相当于一个单指针
2.
数组指针(指针) 指针数组(数组)
函数指针(指针) 指针函数(函数) -------->只看后边两个字就能够区分是指针还是数组或函数
_____________________________________________________________________________
数组指针:(指向数组全部地址的指针)
int a[3]={2,3,4}
int *p = a; // 指向数组的指针
int *p1 = &a[0] // 指向数组首元素的指针
int (*p2)[3] = &a; // 数组指针指向数组的全部地址
3 - > 所指向数组中数据的个数
&a 表示数组从开始到结束全部的地址空间
_____________________________________________________________________________
指针数组:(保存多个地址的数组)
int a=10;
int b=20;
int c=30;
int *pa[3]={&a,&b,&c}; //保存的是 int* (地址)
_____________________________________________________________________________
函数数指针 (指向函数的指针) // 函数名代表函数的入口地址
三个要素: 与所指函数 返回值类型相同,参数类型相同,参数个数相同。
int Max(int a,int b){ }
int (*pfun)(int,int);
main()
{
Max(12,13);
pfun=&Max; ----> pfun=Max;
(*pfun)(12,13); ----> pfun(12,13);
}
_____________________________________________________________________________
指针函数 (返回类型为指针类型称为指针函数)
定义格式: 返回类型标识符 *函数名称(形式参数表)
{ 函数体 }
_____________________________________________________________________________
3 如何区分:
数组指针:
定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n。
指针数组:
定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的 数组元素。
函数指针:
定义 int (*pfun)(int,int); *pfun在括号内,首先形成指针,出括号后仍为括号,指向一个返回值为整形的函数,并且此函数有 两个整形作为形参。
指针函数:
定义 int *fun(); 相当于 int* fun(); 返回值为一个整形的指针。
_____________________________________________________________________________
4.复杂指针:
右左法则: 从未定义的标识符开始阅读,然后先往右看,再往左看。每次遇到圆括号时,掉转方向。
一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到解析完毕。
int (*fun)(int *p);
首先找到那个未定义的标识符,就是fun,它的外面有一对圆括号,而且左边是一个*号,这说明fun是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而fun是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是 int。
int (*fun[5])(int *p) ;
fun右边是一个[ ],说明fun是一个具有5个元素的数组,fun的左边有一个*,说明fun的元素是指针,要注意这里的*不是修饰 fun的,而是修饰fun[5]的,原因是[]运算符优先级比*高,fun先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。