您的位置:首页 > 编程语言 > C语言/C++

C语言复杂声明的理解

2016-07-25 15:03 302 查看
分析复杂的声明,首先要知道常用的运算符如( ),[ ],*等符号的优先级,其次是要用英语常用的表达习惯顺序去一层层去分析声明的含义,将声明分解为A是B,B是C,C是D,这种句式。这样理解起来就比较清楚了。

去理解一个复杂声明的意义,最主要的是学会断句。首先要清楚C语言是西方人发明的,他们主要的语言是英语所以要学会用英语的语法习惯与理解C语言的语法。这样有事会更加容易理解。如下面的一个例子:

char **ppchar;


我们用英语去解释这个声明。首先,要定义的变亮作为主语,所以主语应该是ppchar,*代表指针,由于*的结合方向是从右到左的,所以先翻译最右面的*,所以可以翻译为:ppchar is a pointer to …。然后再翻译左面的pointer:ppchar is a pointer to pointer to…。最后再加上char,所以最后完整的翻译就是ppchar is a pointer to pointer to char。

int(*pnarr)[10];


首先主语是pnarr,所以该句意思应该是pnarr is a pointer…这种格式的。由于[ ]的优先级是最高的,所以进一步翻译pnarr is a pointer of array[10],最后加上int,所以完整的翻译是pnarr is a pinter of array[10] of int。用中文的话就是pnarr指向有10个int元素的数组。

int *parrn[10];


首先主语是parrn,然后[ ]优先级高于*,随意parrn is a array[10]。接着翻译*,所以parrn is a arry[10] of pointer to int。用中文翻译的话就是parrn是一个指针数组,这个指针数组指向int型的变量。

int *fun();


由于( )优先级高于*,所以fun is a function,然后其return值是int型的,所以翻译为fun is a function returning pointer to int。翻译成中文就是fun是一个函数,该函数返回值是一个指向int型的指针。

int (*pfun)();


由于*pfun加了括号,所以pfun is a pointer to 。接着( )表示函数,所以pfun is a pointer to function returning int。

int (*(*fun())[10])()


*fun()表示fun is a function returning pointer,[ ]优先级高于*,所以fun is a function returning pointer to pointer to arry[10] of pointer to function returning int。翻译成中文就是,fun是一个返回值为指针的函数,这个指针指向arry[10]数组,arry[10]的元素是指向函数指针,该函数返回值是int。

char (*(*var[3])())[5];


(*var[3])翻译为var is a arry[3] of pointer to …。接着翻译第二层括号 var is a arry[3] of pointer to function returning pointer to arry[5] of char。翻译成中文就是var是一个arry[3]数组;该数组是一个数组指针指向一个函数;该函数的返回值是一个指针并指向一个char型的数组arry[5]。

C语言中常用typedef来创建新的类型名,该指令并不是去创造新的类型,只是为原来类型新增了一个新名字。从效果上看,typdef与#define类似,不同之处是typedef可以被编译器解释,所以可以处理一些超出#define处理范围的文本替换。 typedef语法的理解方法和上述的方法都是一样的,例子如下:

typedef int (func1)(char *, int *);


同样的,主语是func1,func1 表示一个函数类型,该函数的参数是char *,int *,返回值是int。

再比如:

typedef int (*func2)(char *, char *);


该句意思是:func2表示一个指向函数的指针类型,该函数有两个变量,返回值为int型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息