const
我们可以将const关键字所修饰的变量看作是只读变量,也就是说这个变量不可被修改,只能读取其值。但它决不是常量。在标准C语言中,下面的语句是错误的:
const int i=5; int a[i]={1,2,3,4,5};
诸如5,“hello”这样的常量以及宏定义过的常量之所以不能被修改是因为在内存中没有为他们分配空间,它们存储在运算单元的寄存器中。而上述所言的const修改过的变量说到底还是一个变量,内存中有存储那个变量的地方。只不过,这个变量有些特殊:只能读取。现在再看上面的代码,由于i为变量,它不能用来初始化数组的大小。
接着看下面的代码:
typedef char * charp; char string[4] = "abc"; const char *p1 = string; const charp p2 = string; p1++; p2++;
最后一句会报错,为什么?
在第三句中,p1是可变的,而*p是const的;第四句中,p2是const的,因此不能进行++;也许你此时对p和*p哪一个为const很迷惑。但是没有关系,这里有一个小技巧:将上述语句中的数据类型去掉,离const最近的就是只读的。比如const char *p1 = string去掉char后,*p离const最近,那么*p是const的;再如const charp p2 = string去掉数据类型charp后,p2离const最近,那么p2就是不可改变的。
不过,对于类似const (char *)p1 = string;这样的语句,上述办法有点阻碍。不过你可以将(char*)看成一个整体(你也可以认为是用typedef定义了一个新类型),那么就可以继续用上面的方法。
enum
关于中断处理函数的返回值类型,有下面的定义:
//linux/include/linux/interrupt.h 98typedef irqreturn_t (*irq_handler_t)(int, void *); //linux/include/linux/irqreturn.h 10enum irqreturn { 11 IRQ_NONE, 12 IRQ_HANDLED, 13 IRQ_WAKE_THREAD, 14}; 15 16typedef enum irqreturn irqreturn_t;
有一些书上使用的是int型,并且使用int也可以通过。这是为什么?
其实,了解了枚举类型的本质,这个问题就一目了然了。枚举类型的定义形式如下:
enum
{ 枚举常量1,枚举常量2,……,枚举常量n};
而枚举常量是用标示符表示的整形常量。并且C语言规定枚举常量的默认值依次为:0,1,……,n-1。对应到上面的定义代码,enum irqreturn中三个常量的值即为0,1,2。