1,const在c语言中的含义是readonly,由其定义的变量并不能作为常量使用,例如定义数组时以及作为switch...case中case后的整型或
字符型常量时。c++做了相应扩展。可以用cc/gcc/g++作为测试。
2,枚举类型enum和#define定义宏的区别
(1)枚举类型是在编译期间确定的常量,而宏定义是在预编译期间的常量
(2)枚举定义的符号在调式期间可以显式,而#define定义的宏是是在预编译期间的直接替换,调式不可见。
3,const和typedef结合的陷阱
typedef char* cs;//把cs看成是一种数据类型。
所以 const cs abc;// abc 的类型当然就是 char*;
再因为有const 护体(当然是护abc了),所以 const 作用于 abc 当然不是 abc 所指向的数据,故 写作 :
char* const abc;
4,define和typedef的一点区别
(1)#define INT32 int
unsigned INT32 a=5;//合法:直接替换
(2)typedef int INT32
unsigned INT32 a=5;//不合法:原因是typedef不支持这种扩展(unsigned等关键字和typedef后的名称结合)
5,关于注释的一点说明
(1)int/*...*/i是合法的,/*...*/被编译器替换成空格
(2)x/*y正确吗?编译器会报错,把/*当成注释的前半部分,正确的写法是x/ *y或者x/(*y),二者含义一样。
(3)//abc /
def
这是正确的注释,因为/是对下一行的接续,编译器会去掉/并接续到下一行。
6,一些预编译常量(ANSI定义的宏)
_FILE_:表示正在编译的文件名
_LINE_:正在编译的文件的行号
_DATE_:编译时的日期
_TIME_:编译时的时间字符串
_STDC_:判断该文件是不是定义成标准C程序
7,指向数组的指针
char a[5] = {'a','b','c','d'};
char (*p)[10] = &a;
在g++下会报错误,因为数组的大小不一样。
8,关于指针运算和强制类型转换
char a = 'a';
char *p = &a;
p+1=? //p的地址+sizeof(char)
(int *)p + 1=? //p的地址+sizeof(int)
(int)p+1=? //p的地址+1
9,malloc分配0字节的空间时,char *p = (char *)malloc(0);
这是if(NULL == p)判断假,即p!=NULL;