1.const char** 与char**
VC6.0测试,编译报错cannot convert parameter 1 from 'char ** ' to 'const char ** 'Conversion loses qualifiers
关于此种赋值规定:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符
(1)const char* 与char* ,具有相容类型char,不同的是cont char*是具有限定符const的char的指针,char*是没有限定符的char的指针
(2)const char** 与char**,首先应明白cost char*并不是一个具有限定符类型,它只是一个单纯的指针 ,const char**的类型因此也是一个没有限定符的单纯的指针,意思是其指向一个具有const限定符的char类型的指针的指针,而并不是const类型的char**指针,const char**与char**都是指针,但他们指向的类型是不同的。
2.#define a(x) ti(x)如果不小心写成了 #define a (x) ti(x) 则a(y) 则表示成了 (x) ti(x)(y)
3.关于time_t
附上python脚本:
4.NULL被大量定义在标准头文件中,通常来表示一个空指针,0是一个整型常量,'/0'是一个字符常量,而NUL是一个字符常量的名字。
5.关于switch在C语言中的用法:
(1)switch花括号之后生命的变量,即使进行了初始化,也不会执行,测试代码:
(2)case 段内容即使错误,也会编译通过,但会显示一条警告,VC6测试通过
(3)由const带来的错误,显示error C2051: case expression not constant,这是由于在C中const关键字并不真正表示常量
6.关于static
(1)利用static使程序第一次与第二次运行的结果不一致
(2)static修饰的函数可见性仅限于本文件
7.容易引起的误解
(1)*p.f 等价于 *(p.f)
(2)c=getchar()!=EOF 等价于 c=(getchar()!=EOF)
(3)n<<4+m 等价于 n<<(4+m)
(4)i=1,2 等价于 (i=1) 然后执行常量2的计算,所以i最后=1
8.fgets没规定是阻塞,但读取终端的时候通常阻塞
9.需要注意的空格
(1)最大字符串原则
(2)n=*x/*y /*被理解成/*注释
9.typedef 与#define的区别
(1)对于typedef int x 和#define y int , 则 unsigned y n=0是正确的; unsigned x n=0;是错误的
(2)对于#define int_ptr int*,则int_ptr a,b,a和b被扩展为不同的类型,但typedef不存在这种问题
(3)经典的 typedef char* ptr, 则const ptr表示的是
10.数组与指针的区别
(1)extern int *x 与 extern int y[]
(2)