本文共 1595 字,大约阅读时间需要 5 分钟。
要点1,关于标识符在声明、被强制转换时和被调用时的方法的联系和不统一性:
比如
int *p=1;和int *p;p=1;
比如
char (*j)[20];
j=(chair(*)[20])malloc(20);
比如在声明中()通常代表函数的出现。
要点2,关于类型声明符和类型限定符的作用对象:
文中举例:const int * const p;不得不说此处有关于指针的知识;
而更极端的例子是:volatile char *const int*const p;//实际上我未进行验证,意义应该为p指针本身为const的 ,指向的内容为const int的,而该内容指向的内容为volatile char的。
要点3,关于声明中的优先级的分析:
文中举例的复杂程度较高的声明实际上都和“函数指针”的声明相关,所以有关于函数指针的基础扎实的话应该不会有问题。
关于它的“图标分析”声明优先级我概括如下:声明时首先找到最左边的标识符然后看下此标识符的右边有没有“[]”或者“()”,因为这两者的优先级除了括号以外最高,如果标识符有被什么括号包括的话那么就就把这个括号当成整体,而关于const 、int、 *、volatile 等为修改哪个应该通过以上要点已经清楚了。
总得来说就是函数指针,指针数组,数组指针的套路了,如(*next)(int)为函数指针的声明.
C语言,或者是程序都是目的性非常强的东西。而关于声明那么必须是围绕着标识符进行的。 规律一,关于函数的声明如 int free(void); 像这样的一个声明 也许可以这样看,调用free()函数得到输出值,然后将其输出值强制转换为 int 类型。所以标识符的左边的类型声明符即是它的输出类型,比如int i;又或者j=(unsigned char)i; 规律二,在声明时如果出现(void)或者(int)这种形式则表示函数的输入类型,而左括号的左边则代表指向函数的地址的变量。 规律三:所声明的东西在被调用时通常都是将类型声明符略去之后的“整体”出现的(如函数声明),而相对的不通常的情况下就是指针以除了“*”单独出现以被赋予地址值(如函数指针)。从概率上来说声明的是指针(或者数组)或者非指针是一半一半。而整形变量能不能当成指针用,为什么把指针和整形变量区别定义,原因很简单这样会导致混乱,可能会让程序员少码一行代码但是可能会导致条理混乱,况且*还有乘的意思。 typedef可以让声明在形式上变得更简洁,这样的好处是程序变短了,而且以后需要改定义的时候(如unisgned short在不同平台上的长度不一而需要修改)只需要修改一处即可,这一点和DEFINE的道理是一样的,只不过typedef在“声明领域”更专业而DEFINE则在“只读变量领域”更专业。 typedef的另一层意义是在声明过程中将标识符复用,因为在声明过程中标识符的意义表示得很纯粹。这也是为什么以下行得通的原因。 typedef int (*ptr_to_int_fun)(void); (ptr_to_int_fun) p;
这是在声明代码段中一种充分利用资源的复用。
#define int_ptr int *; int_ptr a,b; 本意是a和b都是int型指针,但是实际上变成 int* a,b; a是int型指针,而b是int型变量。这时应该使用typedef定义: typedef int* int_ptr; int_ptr a,b; 这样a和b就都是int型指针了。 typedef int bana ; unsigned bana i;这样的用法是非法的。 转载地址:http://exixi.baihongyu.com/