博文
c中的陷阱(2006-09-25 11:08:00)
摘要:先看个题目:void fun(char *p1){p1=p1+1;}main(){char *p="abcd";fun(p);cout<<*p;}这个题目看起来非常简单,但对于初学者来说却是个巨大的陷阱.很多初学者在学习c的时候就会听老师说过:指针是可以用来传值,甚至可以不要return;这句话本身没有错误,错的是初学者的理解!首先说一下答案:结果是a不是b这也许出乎你的意料.但是仔细一想就明白了.首先定义了一个字符型指针p,让它指向一个字符串的首地址,如果没有fun函数,那么*p='a';但是现在调用了fun,难道对p没有影响?是的.调用fun的时候,会将p的值传给p1,也就是说现在p1也指向这个字符串的首地址了.然后执行:p1=p1+1;这样p1会指向下一个字符,也就是'b',但是p还是指向首字符!!!所以结果也就出来了.这时候你可能会怀疑你以前学的指针是不是出现了问题.再来看这个题目,你就明白了:void fun(char *p1){*p1=*p1+2;}主函数不变,结果是'c'(a+2),同样p1开始指向了首地址,就当作一个箱子,然后把箱子里的东西换了(*p1),等调用结束以后,下个人(主函数)再来看的时候,箱子里的东西已经变化了!总之,希望初学者在学习的时候多加琢磨一些关键的话语,这对你的分析能力是很有帮助的.2.main(){char p[]={'a','b','c'};char q[]="abc";printf("%d,%d,%d,%d",strlen(p),strlen(q),sizeof(p),sizeof(q));}感兴趣的读者,你能在不上机的情况下说出结果吗?答案 是3,3,3,4.
我们知道strlen测的 是字符串的实际长度,不包括'\0',而sizeof测的是开始分配的空间.对于char q[]="abc";实际上应该是q[4],而对于char p[]={'a','b','c'};这种写法在很多C语言书上是不允许的,因为没有结束符.所以它的结果可能会出乎意料.在此不多作申明.不过如果写成char p[]={'a','b','c','\0'};那么sizeof(p)=4
3.new的问题
初学者都知道new是用来动态分配空间的,可以不用初始化,而直接赋值.如:
int *p=new int;
*p=5;//ok
但是......
