教你理解复杂的C/C++声明

0黄瓜0 2006-04-26 01:43:35
今天研究了一下指针,发现有一篇流传很广的
《教你理解复杂的C/C++声明》一文,对复杂指针
的叙述有不少错误,发上来请各位斟酌。

《教你理解复杂的C/C++声明》一文的中文翻译可见:
http://blog.csdn.net/tangbo6/archive/2006/03/02/613463.aspx


/////////////////////////////////////////
int * (* (*fp1) (int) ) [10];
This can be interpreted as follows:
......
总结:fp1被声明成为一个函数的指针的指针的数组,
这个数组有10个元素,函数的原型为带一个int类型的参数,
返回值为一个指针?
---------------------------------
这个总结,英文原文中没有,不知是译者所加,还是引用文章的人所加?
是错误的。
正确的叙述应为:
fp1是一个指向函数的指针,其指向的函数有一个int参数,返回值是一个
指向10个元素的数组的指针,数组元素的类型为int*。

验证程序:
int * arr[10];
int * (* func(int) ) [10]
{
int*(*pArr)[10]=&arr;
return pArr;
}

int main()
{
int * (* (*fp1) (int) ) [10];
fp1=&func;
return 0;
}

//////////////////////////////////////////////////////
int *( *( *arr[5])())();
......
总结:??
---------------------------------
我来总结:arr是一个5个元素的数组,元素 是一个函数指针,
<<<与这个类型相同int *( * (*pFunc)() )() >>>
这个函数没有参数,返回类型为函数的指针,
<<<与这个类型相同int *( *pF)() >>>
返回指针指向的函数没有参数,且批回类型为int*

验证程序:
int N=10;
int* func1()
{
int *pint=&N;
return pint;
}
int* (* func())()
{
return &func1;
}
int main()
{
int *( *( *arr[5])())();
arr[0]=&func;
return 0;
}
////////////////////////////////////////////////////////////////

那么,带两个char类型的const指针参数、无返回值的函数指针
又该如何声明呢?参考如下:
void * (*a[5])(char * const, char * const);
---------------------------------
这里的原文是:
How about an array of 5 pointers to functions that receive two
const pointers to chars and return a void pointer?

void * (*a[5])(char * const, char * const);

显然这里是翻译错误,特别是“无返回值”大错。试着翻译为:

如何声明一个5个元素的数组,数组元素的类型为
一个带两个char类型的const指针参数、返回值为void*的函数指针

验证程序:
void* func(char * const, char * const)
{
return (void*)0;
}

int main()
{
void * (*a[5])(char * const, char * const);
a[0]=&func;
return 0;
}








...全文
779 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
universes 2006-05-24
  • 打赏
  • 举报
回复
谢谢,看来我还要多多学习
0黄瓜0 2006-05-12
  • 打赏
  • 举报
回复
楼上的函数指针数组应当这样申明:

int (*nd_cmd_parse[3])(int ifindex,ULONG arg) = {
realize_dad_attempts,
realize_managed_flag,
realize_ns_interval,
realize_other_flag,
realize_ra_prefix,
realize_ra_interval,
realize_router_lifetime,
realize_reachable_time,
realize_router_preference,
realize_neighbor_static,
realize_clear_neighbor,
realize_nd_debug
};
这是测试:
#define ULONG unsigned long
int realize_xxxx(int ifindex, ULONG arg){return 0;}
void main1()
{
int (*nd_cmd_parse[12])(int ifindex,ULONG arg);
nd_cmd_parse[12]=realize_xxxx;
}
universes 2006-05-09
  • 打赏
  • 举报
回复
呵呵,刚刚翻了一下自己正在写的程序,发现错了,多谢楼主!

修改后的代码如下:
int (*nd_cmd_parse[](int ifindex,ULONG arg)) = {
realize_dad_attempts,
realize_managed_flag,
realize_ns_interval,
realize_other_flag,
realize_ra_prefix,
realize_ra_interval,
realize_router_lifetime,
realize_reachable_time,
realize_router_preference,
realize_neighbor_static,
realize_clear_neighbor,
realize_nd_debug
}

里面的realize_xxxx都是函数指针,函数原型为:
int realize_xxxx(int ifindex, ULONG arg)。

nd_cmd_parse是一个数组,这个数组里的元素是指针,而且是函数指针,函数的参数的为int 和ulong,返回值为int

以上声明应该是对的吧?
ForestDB 2006-05-06
  • 打赏
  • 举报
回复
不好意思啊,我对something的解释出错了,如果something是(*(*fp1))(int),fp1才是函数指针的指针。

现在重新来过。

还是把int* (*(*fp1)(int)) [10]先简化成int* (something) [10]
something为*(*fp1)(int),是个函数指针,有int参数,返回个指针,指向什么呢?
跳出来,先解释[10],指向一个一维数组,大小为10,数组元素是什么呢?
再看int*,数组元素为int*。
由此看来,楼主的解释是对的。

如果要按翻译的意思表达式该是什么样的呢?改成这楼开始的something,加个括号:int* ((*(*fp1))(int)) [10]。

请大家指正。
ForestDB 2006-05-06
  • 打赏
  • 举报
回复
()和[]的优先级都是最高的,都是从左向右,所以先解释(),再解释[]
这么看来,第一种情况int* (*(*fp1)(int)) [10]可以先简化成int* (something) [10]
解释成它是something的一个一维数组,大小为10,最后跟int*有关
再来看something,*(*fp1)(int),这个应该很简单,函数的指针的指针,函数有个int参数
最后合起来,函数返回int*

那么先读something,再读[],得到,函数指针指针数组,函数原型有int参数返回int*

我觉得好像翻译的是对的。

不知我的理解对不对,还请各位指正。
hlq2p 2006-05-04
  • 打赏
  • 举报
回复
留著看
cunsh 2006-05-04
  • 打赏
  • 举报
回复
mark
bo.cui 2006-05-04
  • 打赏
  • 举报
回复
...
看起来挺晕~
zhangwanlong 2006-05-01
  • 打赏
  • 举报
回复
说得不错
这些复杂声明可以说是C语言特色
erlia 2006-05-01
  • 打赏
  • 举报
回复
可读性差,实际中基本不用.
gudulyn 2006-05-01
  • 打赏
  • 举报
回复
mark and study
bo.cui 2006-04-30
  • 打赏
  • 举报
回复
收藏了先~

谢谢LZ 狂谢~
universes 2006-04-30
  • 打赏
  • 举报
回复
mark
geniuscaobo 2006-04-30
  • 打赏
  • 举报
回复
标记
bombwang 2006-04-30
  • 打赏
  • 举报
回复
ddddddd
kakashemen 2006-04-30
  • 打赏
  • 举报
回复
int * (* (*fp1) (int) ) [10];
This can be interpreted as follows:
......
总结:fp1被声明成为一个函数的指针的指针的数组,
这个数组有10个元素,函数的原型为带一个int类型的参数,
返回值为一个指针?
---------------------------------
这个总结,英文原文中没有,不知是译者所加,还是引用文章的人所加?
是错误的。
正确的叙述应为:
fp1是一个指向函数的指针,其指向的函数有一个int参数,返回值是一个
指向10个元素的数组的指针,数组元素的类型为int*。

我认为楼主的认识是错误的,而那篇文章的描述是正确的。
fiftymetre 2006-04-29
  • 打赏
  • 举报
回复
学习了
吃狼的豆腐 2006-04-29
  • 打赏
  • 举报
回复
顶下,不过看不明白。。。
happytang 2006-04-29
  • 打赏
  • 举报
回复
同意楼主,现在关键变量,然后右左法则
niatclock 2006-04-29
  • 打赏
  • 举报
回复
UP
加载更多回复(5)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧