《C专家编程》笔记——第一章
标签(空格分隔): C专家编程
p19:参数传递赋值约束:要使赋值合法,必须满足下列条件之一:
连个操作数都是指向有限定符或无限定符的相容类型指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。eg1:
char *cp; const char *ccp; cpp=cp;//可以正常赋值
- 左操作数cpp是一个指向有const 限定符的char指针
- 右操作数cp是一个指向没有限定符的char指针
- char类型和char类型都是相容的,左操作数所指向的类型具有右操作数所指向的类型的限定符(无),再加上自身的限定符(const).
- 注意:反过来就不能进行赋值:
cp=ccp; /*编译错误*/
const float *
不是一个有限定符的指针类型—它的类型是“指向一个具有const限定符的float类型的指针”,也就是说const限定符限定的是修饰指针所指向的类型,而不是指针本身。
- eg2:
const char**
也是一个没有限定符的指针类型。它的类型是“指向一个具有const限定符的char类型的指针的指针”。
由于char **
和const char**
都是没有限定符的指针类型,但他们所指向的类型不一样(前者指向char*
,后者指向const char*
),因此他们是不相容的。
p24:对无符号类型的建议:
尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在(如年龄、国债)而用它来表示数量。
尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(如-1被译为非常大的正数)
只有在使用位段和二进制掩码时,才可以使用无符号类型。应该在表达式中使用强制类型转换,是操作数均为有符号或无符号数,这样就不必由编译器来选择类型结果。p25:一个好的宏定义:
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))//使用该方式,移值方便
\\而不是
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(int))//不便于修改数组基本类型
参考:《C编程专家》 Peter Van Der Linden 著 徐波 译