2011.9.4
C 专家编程
1)容易混淆的const:
关键字const并不能把一个变量变为常量,它修饰的符号仅表示该符号的值不能被赋值,也就意味着只读不可写,但它并不能防止通过程序内部(甚至外部,其它函数)的方法来修改它。const最有用支出是用来限定函数的形参,这样该函数不会修改实参指针所指的数据。但其他函数可能修改它,这是c和c++中const最常的用法。
示例代码:
const int limit = 10;//limit是一个常量整型(只读) ,const修饰int
const int *limitp = &limit;
//limitp是一个指向常量整型的指针,指针值为limit的的值,指针值可变。
int i = 27;
limitp = &i; //limitp指针值指向另外一个变量i地址。
这段代码表示limitp是一个指向常量整型的指针,这个指针不能用于修改这个整型数,但是在任何时刻,指针的值却是可以改变的,它都可以指向另外一个地址。就如同,“我给你一个指向它的指针,你不能用指针来修改它。”
其实const命名为readonly更加合适。哈
const float * 表示float是一个指向只读float类型的指针,const限定符不是修饰指针,而是修饰指针指向的类型/内容。char ** 和 const char ** 所指的类型不一样,前者是指向char *的指针,后者是指向const char *的指针,故类型为char**的实参和类型为const char **的形参是不相容的。
2)不同编译器的类型转化不同:
3)编译器对无符号类型的一个bug:
这里的条件语句并不为真,因为sizeof()返回的是unsignd类型,故在进行判断的时候,d被编译器转化为unsigned类型,-1对应的无符号整型是很大的,故这里的条件不可能成立。这个bug在ANSI C 和K&R C中都存在。如果需要修正,可以进行强类型转化:
if(d <= int (TOTAL_ELEMENT ) - 2 )
建议:
1)无论什么时刻,看到“malloc(strlen(str));”这条语句,几乎都可以认为是错误的,
“malloc(strlen(str)+ 1);”才正确。因为其他的字符串处理函数几乎都包含了一个额外的空间,用于容纳字符串结尾的‘\0’字符。
2)一个L的NUL : ASCII 字符串零的位模式,即表示字符串的结束
两个L的NULL: 指向空的指针。
3)多做之过:
4)误做之过:
重载问题:
p = N*sizeof *q; //这里只有一个乘号,sizeof自动把*q作为操作数,相当于p = N * sizeof (*q);
r = malloc(q);
注意:当sizeof操作数是类型名时,则必须添加(),例如 sizeof(char),这常常让人们误以为它是个函数,但操作数是变量时则不需要加括号。
运算符优先级:
结合性:操作符优先级相同的情况下,就出现了左/右结合性
注意:所有的赋值语句(包括复合赋值符)都具有右结合性(a=b=c),而具有左结合性如位操作符(& 和 | ),
![](http://hi.csdn.net/attachment/201109/20/0_13165020626u56.gif)
1、typedef 与 define 的区别:
//定义类型别名,不可扩展成usinged char_p c;来定义,连续定义的类型能够保证声明中所有的变量均为同一类型,而#define定义的类型则无法保证
#typedef char * char_p
char_p a,b,c;//a,b,c三个都是char型指针
//宏文本替换,可以用于扩展成usinged int_p a;来定义,
#define int_p int *
int_p a,b,c;//只有a是int型指针,b,c为int整型变量,即int (*a),b,c;
2、 typedef struct my_tag{int i;}my_type;
struct my_tag variable_1;
my_type variable_2;
这个typedef声明引入了my_type这个别名作为“struct my_tag{int i;}”的简写形式,但它同时也引入了结构标签my_tag.效果即相当于使用了结构标签struct my_tag variable_1,也使用了结构类型my_type variable_2;
而struct my_tag{int i;}my_type;和加了typedef的不一样,只能使用结构标签struct my_tag variable_3;进行定义,而my_type variable_3;则是错误的。
用typedef进行简化的用法1:
原型:void ( *signal( int sig , void (*func)(int) ) ) (int)
化简:typedef void (*ptr_to_func)(int);
ptr_to_func signal(int,ptr_to_func);
用typedef进行简化的用法2(强类型转换的简化):
typedef int (*ptr_to_int_fun)(void);
char *p;...
= (ptr_to_int_fun) p;