C 专家编程

2011.9.4

专家编程 

1)容易混淆的const

关键字const并不能把一个变量变为常量,它修饰的符号仅表示该符号的值不能被赋值,也就意味着只读不可写,但它并不能防止通过程序内部(甚至外部,其它函数)的方法来修改它。const最有用支出是用来限定函数的形参,这样该函数不会修改实参指针所指的数据。但其他函数可能修改它,这是cc++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对应的无符号整型是很大的,故这里的条件不可能成立。这个bugANSI C K&R C中都存在。如果需要修正,可以进行强类型转化:

ifd <= int (TOTAL_ELEMENT )  - 2 )

建议:






1)无论什么时刻,看到“mallocstrlenstr));”这条语句,几乎都可以认为是错误的,

mallocstrlenstr+ 1);”才正确。因为其他的字符串处理函数几乎都包含了一个额外的空间,用于容纳字符串结尾的‘\0’字符。



2)一个LNUL : ASCII 字符串零的位模式,即表示字符串的结束

两个LNULL: 指向空的指针。

3)多做之过:


4)误做之过:



重载问题:

p = N*sizeof *q; //这里只有一个乘号,sizeof自动把*q作为操作数,相当于p = N * sizeof (*q); 

r = mallocq);

注意:当sizeof操作数是类型名时,则必须添加(),例如 sizeofchar),这常常让人们误以为它是个函数,但操作数是变量时则不需要加括号。

运算符优先级:



结合性:操作符优先级相同的情况下,就出现了左/右结合性

注意:所有的赋值语句(包括复合赋值符)都具有右结合性(a=b=c),而具有左结合性如位操作符(和 ),




1typedef 与 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;//只有aint型指针,b,cint整型变量,即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;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值