您现在的位置是:首页 >其他 >解读复杂声明的方式——左右法则网站首页其他
解读复杂声明的方式——左右法则
简介解读复杂声明的方式——左右法则
解读复杂声明的方式——左右法则
解释如下:
从最内侧括号开始阅读声明,向右走,然后向左走。当遇到括号时,方向应相反。一旦括号中的所有内容都解析完,就跳出来。然后继续,直到整个声明被解析。
左右规则的一个注意点:第一次开始阅读声明时,必须从标识符开始,而不是从最内在的括号开始。
举例:
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++服务器
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。