黑马程序员技术交流社区
标题:
sizeof与strlen结合上c中两种字符串定义方式,貌似有点小猫腻
[打印本页]
作者:
godlike
时间:
2014-5-5 21:02
标题:
sizeof与strlen结合上c中两种字符串定义方式,貌似有点小猫腻
本帖最后由 godlike 于 2014-5-14 14:07 编辑
今天百度看到一道c语言的面试题,sizeof与strlen的区别;自己试了一下,发现了什么好像,请多多指教啊。
大家都知道,sizeof:计算某个变量或者某种数据类型在内存中所占的字节; strlen 计算字符串的长度
对于同一个字符串:sizeof会把'\0'也算进去,strlen则是除去'\0'的字符串长度;
int main()
{
char name[] = "abc哈";
printf("sizeof(name)=%lu\n", sizeof(name));//结果为7,说明了一个汉字占3个字节
printf("strlen(name)=%lu\n", strlen(name));//除去'\0',结果自然是6
}
复制代码
请看另外的情况:这样定义字符串:char *name = "哈";
int main()
{
char *name = "哈";
printf("sizeof(name1)=%lu\n", sizeof(name1));//结果为8,并且无论name1怎么变,这个值都不会变
printf("strlen(name1)=%lu\n", strlen(name1));//结果正常
}
复制代码
这是不是也算区别,用指针的形式定义字符串,sizeof()的值固定是8,也就是指针的大小,这么理解我忍了,但是数组名也是地址啊,为什么就不是输出它的地址的所占的字节数;
还没完:sizeof可以这样输出: sizeof(*name),且结果又不变,一直是1
int main()
{
char *name1 = "哈哈哈";
printf("sizeof(name)=%lu\n", sizeof(*name1));//结果是1了
printf("strlen(name)=%lu\n", strlen(name1));//结果正常:9
}
复制代码
好吧,这下我彻底晕了:dizzy:
作者:
godlike
时间:
2014-5-5 21:04
二楼怎么看
作者:
D调的沉默
时间:
2014-5-5 21:38
二楼表示看不懂。表示看不懂你看不懂哪一块,我就当你不懂最后一个吧。
char *name1 表示是一个指向字符串的指针,因为它是字符类型的,所以(*name1)取的时第一个字符的大小,char *name1之所以能指向一个字符串,它只是指向了字符串的首字符的地址。所以你的(*name1)就是1字节了。
strlen(name1)它的功能是计算以该name1地址开始的字符,直到遇到'\0',然后计算所有的字符长度,所以当然是9了。
懂了吗?小伙伴,要是还不懂,可以@我哦!:#
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2