首页 > 代码库 > 数组指针、指针数组、函数指针、指针函数 -----笔记

数组指针、指针数组、函数指针、指针函数 -----笔记

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。

 

数组指针、指针数组、函数指针、指针函数 -----笔记