sizeof
sizeof本质是运算符,其值在编译时就计算好了,参数可以是数组、指针、类型、对象、函数等,它的功能是获得保证能容纳实现所建立的最大对象的字节大小。其返回类型为size_t,在头文件中typedef为unsigned int。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,如int*的长度为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
strlen
strlen本质是函数,运行时才能计算。参数必须是字符型指针(char*),当数组名作为参数传入时,看成是指针。
例
char s[100] = "0123456789";
sizeof(s)结果是100,表示编译器为其分配的数组空间大小。
strlen(s)结果是10,strlen是个函数,内部实现是用一个循环计算到\0为止之前的长度。
char s[] = "0123456789";
sizeof(s)结果为11,因为s是数组,计算到\0位置。
strlen(s)结果为10,原因同上。
char* s = "0123456789";
sizeof(s)结果为4,因为s是指向字符串常量的字符指针,32位机器的指针都占4字节;
sizeof(*s)结果为1,因为*s是第一个字符char型占一个字节;
strlen(s)结果为10,原因同上;
strlen(*s)结果报错,strlen的参数只能是char*,且必须是以‘\0‘结尾的。
int s[100] = "0123456789";
sizeof(s)结果为400,因为每一个元素占4个字节了,所以100*4=400。
strlen(s)结果报错,因为传入的不是char*类型参数。