c语言之左右法则

本文介绍了C语言中解析复杂指针声明的左右法则,从最里面的标识符开始,按照右左顺序理解括号内的内容。文章列举了多个例子,包括指针、数组、函数指针的嵌套,帮助读者掌握这一法则。

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(*)的函数,函数的返回值是一个函数指针,该函数形参为空返回值为空


例子就解释到这里,只要多解释多练习问题就不大,希望对大家有所帮助。





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值