作者在 2011-03-31 22:18:58 发布以下内容
用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。
用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为0的字符'\0'初始化。
if(flags & FLAG) 是 if(flags & FLAG != 0 ) 的意思,但 if (flags & FLAG != 0) 是错误的。因为!=运算符的优先级高于&运算符。
r是一个8位整数,且r的低四位与low各位上的数一致,而r的高四位与hi的各位上的数字一致,hi和low是2个整数,值介于0到15之间,则r=(hi << 4)+ low;或者r = hi << 4 | low;而r = hi << 4 + low;是错误的,因为加法的优先级高于移位运算。
任何一个逻辑运算符的优先级低于任何一个关系运算符。
移位运算符优先级比算数运算符要低,但是比关系运算符高。
对于一个数组,只能做两件事:确定该数组的大小以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,都是通过指针进行的,任何一个数组下标运算都等同于一个对应的指针运算。
如果两个指针指向的是同一个数组的元素,可以把两个指针相减,这样是有意义的,如:int *q = p + i;可以通过q -p得到i 的值,但如果q与p指向的不是同一个数组中的元素,即使它们所指向的地址在内存中的位置正好间隔一个数组元素的整数倍,所得到的结果仍然是无法保证其正确性。
数组名a除了被用作运算符sizeof的参数这一情况,其他所有情形中数组名a都都代表指向数组a中下标为0的元素的指针。*a即数组a中下标为0的元素的引用。*(a+i)即数组a中下标为i的元素的引用,简记为a[i].
数组作为函数参数毫无意义,C语言会自动地将作为参数的数组声明转换为相应的指针声明。即 int strlen(char s[]){} 与 int strlen(char *s){} 完全相同。但是如果一个指针参数并不实际代表一个数组,即使从技术上而言是正确的,采用数组形式的记法常会起到误导的作用。如果一个指针参数代表一个数组,则两种写法完全等价,如: main (int argc,char * argv[]) 与 main (int argc,char ** argv)完全等价。
复制指针并不等同与同时复制所指向的数据。
如char *p,*q; p = "xyz";
p的值是一个指向'x'、'y'、'z' 和'\0'4个字符组成的数组的其实元素的指针。因此,执行语句q = p;后,p 和q是两个指向内存中同一个地址的指针,这个赋值语句并没有同时复制内存中的字符。
当常数0被转换为指针使用时,这个指针绝对不能被解除引用。即当我们将0赋值给一个指针变量时,绝对不能企图使用该指针指向内存中存储的内容。