如何理解c和c ++的复杂类型声明
2012-11-14 14:19
288 查看
需要强调一下的是,复杂的C/C++声明并不是好的编程风格;我这里仅仅是教你如何去理解这些声明。注意:为了保证能够在同一行上显示代码和相关注释,本文最好在至少1024x768分辨率的显示器上阅读。
让我们从一个非常简单的例子开始,如下:
int n; |
int *p; |
再来看一个指针的指针的例子:
char **argv; |
int RollNum[30][4]; int (*p)[4]=RollNum; int *q[5]; |
int **p1; // p1 is a pointer to a pointer to an int. int *&p2; // p2 is a reference to a pointer to an int. int &*p3; // ERROR: Pointer to a reference is illegal. int &&p4; // ERROR: Reference to a reference is illegal. |
const修饰符
当你想阻止一个变量被改变,可能会用到const关键字。在你给一个变量加上const修饰符的同时,通常需要对它进行初始化,因为以后的任何时候你将没有机会再去改变它。例如:
const int n=5; int const m=10; |
const int *p; int const *q; |
int * const r= &n; // n has been declared as an int |
组合上述两种const修饰的情况,我们来声明一个指向const int类型的const指针,如下:
const int * const p=&n // n has been declared as const int |
char ** p1; // pointer to pointer to char const char **p2; // pointer to pointer to const char char * const * p3; // pointer to const pointer to char const char * const * p4; // pointer to const pointer to const char char ** const p5; // const pointer to pointer to char const char ** const p6; // const pointer to pointer to const char char * const * const p7; // const pointer to const pointer to char const char * const * const p8; // const pointer to const pointer to const char |
typedef的妙用
typedef给你一种方式来克服“*只适合于变量而不适合于类型”的弊端。你可以如下使用typedef:
typedef char * PCHAR; PCHAR p,q; |
typedef char * a; // a is a pointer to a char typedef a b(); // b is a function that returns // a pointer to a char typedef b *c; // c is a pointer to a function // that returns a pointer to a char typedef c d(); // d is a function returning // a pointer to a function // that returns a pointer to a char typedef d *e; // e is a pointer to a function // returning a pointer to a // function that returns a // pointer to a char e var[10]; // var is an array of 10 pointers to // functions returning pointers to // functions returning pointers to chars. |
typedef struct tagPOINT { int x; int y; }POINT; POINT p; /* Valid C code */ |
函数指针可能是最容易引起理解上的困惑的声明。函数指针在DOS时代写TSR程序时用得最多;在Win32和X-Windows时代,他们被用在需要回调函数的场合。当然,还有其它很多地方需要用到函数指针:虚函数表,STL中的一些模板,Win NT/2K/XP系统服务等。让我们来看一个函数指针的简单例子:
int (*p)(char); |
char ** (*p)(float, float); |
void * (*a[5])(char * const, char * const); |
对上述“右左法则”做一个小小的修正:当你第一次开始阅读声明的时候,你必须从变量名开始,而不是从最内部的括号。
下面结合例子来演示一下“右左法则”的使用。
int * (* (*fp1) (int) ) [10]; |
1. 从变量名开始——fp1
2. 往右看,什么也没有,碰到了),因此往左看,碰到一个*——一个指针
3. 跳出括号,碰到了(int)——一个带一个int参数的函数
4. 向左看,发现一个*——(函数)返回一个指针
5. 跳出括号,向右看,碰到[10]——一个10元素的数组
6. 向左看,发现一个*——指针
7. 向左看,发现int——int类型
总结:fp1被声明成为一个函数的指针,该函数返回指向指针数组的指针.
再来看一个例子:
int *( *( *arr[5])())(); |
1. 从变量名开始——arr
2. 往右看,发现是一个数组——一个5元素的数组
3. 向左看,发现一个*——指针
4. 跳出括号,向右看,发现()——不带参数的函数
5. 向左看,碰到*——(函数)返回一个指针
6. 跳出括号,向右发现()——不带参数的函数
7. 向左,发现*——(函数)返回一个指针
8. 继续向左,发现int——int类型
还有更多的例子:
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. |
相关文章推荐
- 如何理解c和c ++的复杂类型声明
- 如何理解c和c ++的复杂类型声明
- (转载)如何理解c和c++ 的复杂类型声明
- 转:如何理解c和c ++的复杂类型声明
- 如何理解c和c ++的复杂类型声明
- [转]如何理解c和c ++的复杂类型声明
- 如何理解c和c ++的复杂类型声明
- 【转】如何理解c和c++的复杂类型声明
- 如何理解c和c++的复杂类型声明
- 如何理解c和c++ 的复杂类型声明
- 如何理解c和c++的复杂类型声明
- 如何理解c和c++的复杂类型声明
- 如何理解c和c++ 的复杂类型声明
- 如何理解C和C++的复杂类型声明
- 如何理解C和C++的复杂类型声明
- [转帖]如何理解C和C++的复杂类型声明
- 如何理解c和c ++的复杂类型声明
- 如何理解c和c ++的复杂类型声明
- 如何理解c和c++的复杂类型声明
- 如何理解c和c ++的复杂类型声明