Sizeof与Strlen的差异与联络
一、sizeof
**************
二、strlen
*****************
三、举例:
************
四、参考资料:
Sizeof与Strlen的差异与联络(转)
1.sizeof操作符的成果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型确保能包容完结所树立的最大目标的字节巨细。
2.sizeof是算符,strlen是函数。
3.sizeof能够用类型做参数,strlen只能用char*做参数,且有必要是以完毕的。
sizeof还能够用函数做参数,比方:
short f();
printf(“%d”, sizeof(f()));
输出的成果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时分就把sizeof核算过了 是类型或是变量的长度这便是sizeof(x)能够用来界说数组维数的原因
char str[20]=”0123456789″;
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的成果要在运转的时分才干核算出来,时用来核算字符串的长度,不是类型占内存的巨细。
7.sizeof后假如是类型有必要加括弧,假如是变量名能够不加括弧。这是由于sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 回来实践的巨细,
当适用一静态地空间数组, sizeof 偿还悉数数组的尺度。
sizeof 操作符不能回来动态地被分派了的数组或外部的数组的尺度
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的巨细
假如想在函数内知道数组的巨细, 需求这样做:
进入函数后用memcpy复制出来,长度由另一个形参传进去
fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}
咱们能常在用到 sizeof 和 strlen 的时分,通常是核算字符串数组的长度
看了上面的具体解说,发现两者的运用仍是有差异的,从这个比如能够看得很清楚:
char str[20]=”0123456789″;
int a=strlen(str); //a=10; >>>> strlen 核算字符串的长度,以完毕符 0x00 为字符串完毕。
int b=sizeof(str); //而b=20; >>>> sizeof 核算的则是分配的数组 str[20] 所占的内存空间的巨细,不受里边存储的内容改动。
上面是对静态数组处理的成果,假如是对指针,成果就不相同了
char* ss = “0123456789”;
sizeof(ss) 成果 4 ===》ss是指向字符串常量的字符指针,sizeof 取得的是一个指针的之所占的空间,应该是
长整型的,所所以4
sizeof(*ss) 成果 1 ===》*ss是榜首个字符 其实便是取得了字符串的榜首位0 所占的内存空间,是char类
型的,占了 1 位
strlen(ss)= 10 >>>> 假如要取得这个字符串的长度,则一定要运用 strlen