sizeof是操作符,strlen是库函数,他俩一个是计算大小的,一个是计算长度的。
sizeof是计算变量(类型)在内存中所占空间的大小。单位是字节
注意:
1:类型不占空间,通过类型创建的变量占空间
2:当sizeof计算指针变量的大小,可能是4个字节大小也有可能是8个字节大小。
指针变量是存放地址编号的
如果地址编号由32位二进制数组成,存放地址编号时,要申请32个比特位的空间存放,一个字节=八个比特位,也就是四个字节的空间。
如果地址编号由64二进制数组成,存放地址编号时,要申请64个比特位的空间存放,一个字节=八个比特位,也就是8个字节的空间。
strlen是计算字符串的长度,字符串有两个特性:
1:字符串末尾放着\0,\0是字符串结束的标志。
2:字符串和数组一样,也是在内存中连续存放的。
此时将字符串的第一个字符,作为地址,传给strlen函数,strlen将会以这个地址一直向后找\0,统计\0之前的字符的个数,个数即长度。
写到这里,我们也会发现:
strlen是比较”痴情“的一个函数,它只倾向于\0,不遇到\0,它不会回头,并且它只针对字符串工作。
siezof就比较普通了,没有什么特点。
例:
char arr1[]={"abcd"};
char arr2[]={'a','b','c','d'}:
sizeof(arr1)=5;
strlen(arr1)=4;
// 虽然此时使用strlen函数,将数组名arr1传给了strlen函数,但它不会计算数组的长度,而是计算数组中字符串的长度。是一个痴情的函数。
strlen(arr2)= (不确定值)
sizeof(arr2)=4;
在这里特别注意的是\0,如果向数组中没有主动放\0,并求我们向数组中存放的字符长度时,strlen函数则会一直在内存中向后寻找\0,直到在内存中遇到\0,他才会停止工作,并将\0之前出现的字符个数返回。
所以说,此时求得的字符的长度是不确定的。