您现在的位置是:首页 >其他 >解读复杂声明的方式——左右法则网站首页其他

解读复杂声明的方式——左右法则

图灵,图灵,图个机灵 2024-06-17 11:26:54
简介解读复杂声明的方式——左右法则

解读复杂声明的方式——左右法则

解释如下:

从最内侧括号开始阅读声明,向右走,然后向左走。当遇到括号时,方向应相反。一旦括号中的所有内容都解析完,就跳出来。然后继续,直到整个声明被解析。

左右规则的一个注意点:第一次开始阅读声明时,必须从标识符开始,而不是从最内在的括号开始。

举例:

int * (* (*fp1) (int) ) [10];

按一下步骤开始庖丁解牛:

从标识符开始 -------------------fp1
右边是 ) ,左右向左看,找到了*---fp1是一个指针
跳出()后遇到了(int) ------------指针指向了一个函数,函数中有一个int参数
向左看,找到了 * ---------------该函数返回指针
跳出(), 向右看,找到了 [10] ----返回的指针指向含有10个元素的数组
向左看,找到了 * ---------------数组元素都是指针
在向左看, 找到 int -------------每个数组元素指向int类型

解剖完毕 英文完整的解释:

Start from the variable name -------------------------- fp1
Nothing to right but ) so go left to find * -------------- is a pointer
Jump out of parentheses and encounter (int) --------- to a function that takes an int as argument
Go left, find * ---------------------------------------- and returns a pointer
Jump put of parentheses, go right and hit [10] -------- to an array of 10
Go left find * ----------------------------------------- pointers to
Go left again, find int -------------------------------- ints.

declare fp1 as pointer to function (int) returning pointer to array 10 of pointer to int

再来练习一个:

int *( *( *arr[5])())();
从标识符开始 -----------------arr
右边,找到[5] -----------------arr是一个数组,5个元素
向左看, 找到 * ---------------每个元素都是指针
跳出(), 向右看,找到了() ------每个指针指向函数,即数组元素为函数指针
向左看, 找到 * --------------- 所指向的函数返回指针
跳出(), 向右看,找到了() -------返回值指向函数
向左看, 找到 *  ---------------函数返回指针
继续向左看, 找到 int ----------指针指向 int类型数据.

解剖完毕 英文完整的解释:

Start from the variable name --------------------- arr
Go right, find array subscript --------------------- is an array of 5
Go left, find * ----------------------------------- pointers
Jump out of parentheses, go right to find () ------ to functions
Go left, encounter * ----------------------------- that return pointers
Jump out, go right, find () ----------------------- to functions
Go left, find * ----------------------------------- that return pointers
Continue left, find int ----------------------------- to ints.

declare arr as array 5 of pointer to function returning pointer to function returning pointer to int

罗列一些复杂的c声明以及解释供学习:

float ( * ( *b()) [] )();              // b is a function that returns a 
                                       // pointer to an array of pointers
                                       // to functions returning floats.

void * ( *c) ( char, int (*)());       // c is a pointer to a function that takes
                                       // two parameters:
                                       //     a char and a pointer to a
                                       //     function that takes no
                                       //     parameters and returns
                                       //     an int
                                       // and returns a pointer to void.

void ** (*d) (int &, char **(*)(char *, char **));   // d is a pointer to a function that takes
                                       // two parameters:
                                       //     a reference to an int and a pointer
                                       //     to a function that takes two parameters:
                                       //        a pointer to a char and a pointer
                                       //        to a pointer to a char
                                       //     and returns a pointer to a pointer 
                                       //     to a char
                                       // and returns a pointer to a pointer to void

float ( * ( * e[10]) (int &) ) [5];    // e is an array of 10 pointers to 
                                       // functions that take a single
                                       // reference to an int as an argument 
                                       // and return pointers to
                                       // an array of 5 floats.

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。