教你理解复杂的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;
}