c专家编程

   近来,看了一下《c专家编程》这本书,还是有一点收获吧!也许,我的水平还不适合读这本书吧!但是,将书中的一些注意点记在这儿。

1.要使二个赋值形式合法,必须满足一下条件:

二个操作数都是指向有限定符或者无限定符的相容类型指针,左边指针所指向的类型必须具有右边指针指向类型的全部限定符。

比如:char *cp;

const char *cpp;

cpp=cp;这样就是可以的,如果cp=cpp,这样就会报错,因为左边的cp不具有右边cpp的限定符const.

2.const限定符只是表示这个符号不能被赋值,也就是说它的值对这个符号来说是只读的。const的最有用的地方就是用它来限定函数的形参,这样该函数将不能修改实参指针所指的数据。

这儿当然还有一个问题就是const的位置不同,式子所表示的意义也不同。

(1).const char *p;

(2).char const *p;

(3).char * const p;

这三个式子中1和2是一样的意义,都表示的是指针所指向的内存中的数据是只读的,不能被修改,而这个指针中的数据可以修改,也就是这个指针可以在指向别的变量或者内存。

而3表示的则是另一个意义,它表示的是这个指针中的数据(地址)是不能被修改的,而指针中的地址,也就是这个指针所指向的内存中的数据可以被修改。


3.还有就是关于二个函数:strlen();这个函数注意点就是它返回的只是字符串的长度,这个长度中没有包括最后的字符结束标识符“\0”,这样的话,就在动态申请内存时,使用malloc()函数时,就malloc(strlen(c)+1);c就是一个字符指针或者字符数组名。还有就是注意sizeof()函数的返回值是一个无符号数,这样看下面的一个例子:

#include<stdio.h>
#include<stdlib.h>
#define T (sizeof(array)/sizeof(array[0]))
int main()
{
 int array[]={23,34,12,17,204};
 int d=-1,x;
 if(d<=T-2)
 {
  x=array[d+1];
  printf("%d\n",x);
 }
 printf("over");
}

在这个程序执行中始终执行不了if,也就是if判断一直是假的,这是因为sizeof的返回值是一个无符号数,在比较的过程中-1转化为了一个无符号数,这样就会是一个特别大的数,所以为假,因为K&R C所采取的是“无符号保留原则”,就是当一个无符号数于int或者更小的整数混合使用时,结果是无符号数。当然,这也要取决于编译器了。

在C语言中还有一个奇葩的函数就是字符串比价函数strcmp();这个函数是当二个字符串相等时,函数返回的才是0,所以,这个在使用时要注意!不过我们可以用一个宏定义来解决这个问题,使之符合我们的日常逻辑:

#define STRCMP(a,R,b) (strcmp(a,b) R 0)

现在我们在使用时可以:

if(STRCMP(s,==,"cer")){};这样使用,s是一个字符串;

4.typedef和指针:

typedef string *pstring;

const pstring cstr;

这个cstr是什么类型。也许很多人会搞错,以为是const string * pstring,是一个指向只读字符串的指针,其实,不是这样的,如果你这样想的话,就是将typedef当作是一个文本扩展了,注意的是,其实,声明const pstring时就是const修饰的就是pstring的类型,这是一个指针类型,所以,这条声明就是指向string的只读指针,这个等价于:

string * const cstr;这个就是要看const究竟修饰的是什么,离那个近的问题。

这算是本人的一点笔记吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值