这篇文章除了会说一些C中的 "\0" 问题,还会说一些常用的东西。
1.在不使用第三个变量的情况下,交换两个变量的值:
方法一: int a,b a=a+b; b=a-b; a=a-b;
方法二: int a,b a=a^b; b=a^b; a=b^a;
2. "\0"问题:
运行结果如下:
由以上结果可以看出 char str[]="abcde" 的大小为6,可见 " \0 "是自动加进去的,因为是以字符串的形式赋值的。这个要记住。 sizeof(str)求得是整个数组的大小。因为char为1个字节,所以为6,而int instr[10],因为int为4个字节,所以为4 x 10 = 40,而当char szstr[10],即指定数组的大小时,不管数组中有几个元素,sizeof(szstr)总为10(此处为 char 类型,int类型则为40)。函数strlen()算长度是不加 "\0". 还有就是int a=2 时 sizeof(2) 和sizeof(a)是一样的。而sizeof int 则是不对的,不能这样用。我们只需要记着sizeof是把括号加上就可以啦。
下面接着测试strlen()遇 "\0"的情况和给指针赋值的情况:
运行结果如下:
从上面的结果可以看出,当给一个字符数组单个赋值时(未指明数组的大小),即用{}号的形式时,数组的大小就是数组中元素个数的大小,此时是不自动加 "\0"的。strlen(a)=2是因为strlen()遇 \0 结束。sizeof(str) = 5是因为str的存储数据为 { ‘1’,‘2’,‘\034', '\0', '\0'}因为是以字符串的形式赋值的,所以自动加的 \0,而此处的 \034 为 一个字符,它代表的是ASCII值的八进制为”\034“的字符。这个需要切记!类似的还有十六进制的。
注意:sizeof如用于数组,只能测出静态数组的大小,无法检测出动态分配的或者是外部数组的大小。当数组做参数时,数组名是当作指针使用的。例如:void fun (char str[]) 此时sizeof(str) = 4的。
下面再测一下笔试中经常出现的问题:
1.指针指向的常量(未加const的),如下图:
运行结果如下图:
出现段错误的原因是因为 "AAA"是一个字符串常量,等同于const char *p = "AAA" p所指向的地址的值是不能被改变的,而p[0]却试图去改变它,所以会出现段错误,但p所指向的地址是可变得,如下图:
运行结果如下:
下面的也是经常出现的笔试题:指针分配的空间的问题
运行结果如下图:
因为str无空间,指针在使用时一定要初始化,初始化为空也可以,因为如果不初始化则可能会出现内存的越界访问问题。而用strcpy时指针的空间一定要够用!
还有几个函数 是关于 \0 的问题,回来再补,嘿嘿!
阅读(4952) | 评论(0) | 转发(0) |