sizeof与strlen 对字符串

来源:互联网 发布:淘宝装修公司靠谱吗 编辑:程序博客网 时间:2024/04/29 21:10

接下来通过分析实例来区分sizeof与strlen

例1:
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符,字符占1个字节
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到/0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到/0为止之前
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4,32位机种int整形数据占4个字节
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''/0''结尾的
char q[]="abc";
char p[]="a/n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2
例2:
class X
{
int i;
int j;
char k;
};
X x;
cout<第三个例子:char szPath[MAX_PATH]
  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)

深入理解Sizeof与strlen的本质
简单的讲,sizeof 是求变量或类型的存储长度。而strlen 是统计字符串中字符的个数,不包括终止符‘/0’。sizeof 是求得实体(就是"()"里面包含的变量或者类型字)的字节单位长度。按照类型来判断;strlen 是求得字符的长度,累加搜索,直到 /0截至为止。

sizeof(xxx)是个保留字,用来求分配给xxx的内存空间大小的,举例来说sizeof(int)就是求分配给int型变量的内存大小。strlen(const char*)这是个字符串相关函数,其中,参数必须是个字符指针(指向字符串的指针)或字符串,而返回值就是这个指针指向的字符串的长度,字符串结束必须以'/0'为标记,但'/0'不计入字符串长度。

Sizeof与strlen的区别及联系

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''/0''结尾的。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

char str[20]="0123456789";//str是编译期大小已经固定的数组
int a=strlen(str); //a=10;//strlen()在运行起确定
int b=sizeof(str); //而b=20;//sizeof()在编译期确定

6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

char c;
sizeof c;//变量名可以不加括弧

8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)

0 0
原创粉丝点击