近来,看了一下《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究竟修饰的是什么,离那个近的问题。
这算是本人的一点笔记吧!