C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。
什么是左右法则呢?下面我会通过定义与一些例子尽量给大家讲解一下,希望对大家有所帮助。
右左法则:首先从最里面的圆括号内未定义的标识符开始阅读看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
在通过复杂例子解析左右结构之前,我先说一下指针数组嵌套中的一些基本类型
1
1.int a; 整形变量
2.int *a; 整形指针变量
3.int **a; 整形指针的指针变量(一个指向指针的指针,它指向的指针指向一个整形数)
4.int a[10]; 整形数组
5.int *a[10]; 整形指针数组(一个数组中有10个指针,该指针指向一个整形数)
6.int (*a)[10]; 整形数组指针(一个指向有10个整形数组的指针)
7.int (*a)(int); 函数指针变量(一个指向函数的指针,该函数有一个整形参数并返回一个整形数)
8.int (*a[10])(int); 函数指针数组(一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整形数)
介绍完一些基本类型,下面来介绍一些复杂的例子
1.int *( * ( *fpl ) ( int ) ) [10];
--*fpl 知道fpl是一个指针
--*(*fpl)(int) 知道指针fpl指向一个形参为int,返回值为指针的函数
--int *(*(*fpl)(int))[10] 知道该函数的指针指向一个数组,该数组有10个元素,并且每个元素指向一个整数
总结:fpl被声明为一个函数的指针,该函数返回值是一个指向指针数组的指针
2.int * ( * ( * arr [5] ) ( ) ) ( );
--*arr [5] 知道arr是指针数组,数组arr里有5个指针,每个元素里存放着某某的地址
--*( * arr [5] )( ) 知道函数指针数组,一个有5 个指针的数组,该指针指向一个形参为空,返回值为某某的函数
--int * ( *( * arr [5] )( ) ) ( )接上面,知道该函数返回一个指向函数指针的指针
总结:函数指针数组,arr[5]中的元素被声明为一个函数的指针,该函数的返回值是一个指向函数指针的指针
下面几个例子我在这边就不在具体分析了
3.float ( * ( * e [10] ( int * ) ) [5] );
总结:函数指针数组,e[10]中的元素被声明为一个函数的指针,函数的返回值是一个指向浮点型数组的指针
4.void * ( * ) ( char , int ( * )( ) );
总结:函数指针变量,指针指向一个形参为char和int(*)的函数,函数的返回值是一个函数指针,该函数形参为空返回值为空
例子就解释到这里,只要多解释多练习问题就不大,希望对大家有所帮助。
本文介绍了C语言中解析复杂指针声明的左右法则,从最里面的标识符开始,按照右左顺序理解括号内的内容。文章列举了多个例子,包括指针、数组、函数指针的嵌套,帮助读者掌握这一法则。
7万+

被折叠的 条评论
为什么被折叠?



