指针详解

int a;//a是一块空间,内容是一个整型变量
int *a;//a是一块空间,内容是是一个指针变量,它指向整型,即一个指向整型的指针
int **a;//a是一块空间,内容是是指针的指针,它指向的是整型

int a[10];//a是一块空间,内容是是一个数组,它里面的元素是整型数据
int *a[10];//下标的优先级高于间接访问操作符,所以a先和[10]结合,再和*结合
             //所以,a是一块空间,内容是是一个数组,它的元素类型是指向整型的指针 (称之为:指针数组,核心是数组,其中元素是指针)
int (*a)[10];//a先和间接访问操作符结合,再和取下标结合
             //所以,a是一个指针,它指向的是一个整型数组 (称之为:数组指针,核心是指针,指向的是数组)

int a();//a是一个函数,此函数无形参输入,返回值为整型
int *a();//函数调用符的优先级高于间接访问操作符,所以a先和()结合,再和*结合
         //所以,a是一个函数,此函数的返回值是指向整型的指针
int (*a)();//a先和间接访问操作符结合,再和函数调用操作符()结合
             //所以,a是一个指针,它指向的是一个函数,此函数的返回值是一个整型值
             //即,a是一个函数指针,它所指向的函数返回一个整型值 (称之为:函数指针)
          
int (*a[])();//先对括号内表达式*a[]进行求值,所以a是一个元素为某种类型的指针的数组,即它是一个数组,其元素类型是指针,但此指针的指向还没确定
             //再结合函数调用符,所以a是一个数组,数组元素类型是函数指针,它所指向的函数的返回值是一个整型值
int *(*a[])();//此指令和上面的区别是,多了一个间接访问操作符。
              //所以此声明创建了一个指针数组,指针所指向的类型是返回值为整型指针的函数。区别只是在所指向的函数的返回值类型。
/*
总结:
解引用访问操作符*的优先级很低,它低于下标[],函数调用符()等。
最先和变量名a结合的,也就是最里层的最核心的最根本的,这个就决定了a到底是什么东西。
而返回值,应该看表达式的最外层。
*/

auto (*f)()    ->int(*)();//F是什么
int(*  (*fx)()   )();//返回值函数指针

auto pf(void)->  auto(*)(int x)   ->  int(*)(int a, int b)
// int(*)(int a, int b)
//     int(* (* pf(void))(int x) )(int a, int b)

//  int(*     (* pf(void)  )(int x)          )(int a, int b)

auto go(    int a, int(*)(int, int)      )->auto(*)(     int(*)(int, int)      )-> int (*)(int,      int(*)(int, int(*)(int, int))     );

// int (*(*   go(    int a, int(*)(int, int)      )   )(     int(*)(int, int)      ))(int,      int(*)(int, int(*)(int, int))     )



posted @ 2016-11-25 12:54  乐天的java  阅读(87)  评论(0)    收藏  举报