sizeof 与 strlen 对应的概念一直没有弄仔细,弄明白,这次开个专题主要解决这几类问题
主要参考网上以及定义来解决
一、定义
sizeof:在Pascal语言中,sizeof是一种内存容量度量函数(主要偏重于内存容量),功能是返回一个变量和类型的大小(以字节为单位),因此在C语言中,sizeof主要是判断一个数据类型或者表达式长度的运算符,其运算是在编译阶段进行的
strlen:strlen所做的是一个计数器的工作,他从内存的某个位置(可以使字符串的开头,中间的某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到字符串结束符“/0”为止,然后返回计数值(长度不包含“/0”)。
二、区别
1)strlen函数求的是字符串的实际长度,如果只定义而没有赋初值,那么求得结果是不确定的,他会一直扫描。指导遇到/0字符为止
但是sizeof()返回的是变量声明所占内存数,不是实际长度,另外sizeof不是函数,是一个取字节运算符。strlen是函数
2、⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是取字节运算符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
主要参考网上以及定义来解决
一、定义
sizeof:在Pascal语言中,sizeof是一种内存容量度量函数(主要偏重于内存容量),功能是返回一个变量和类型的大小(以字节为单位),因此在C语言中,sizeof主要是判断一个数据类型或者表达式长度的运算符,其运算是在编译阶段进行的
strlen:strlen所做的是一个计数器的工作,他从内存的某个位置(可以使字符串的开头,中间的某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到字符串结束符“/0”为止,然后返回计数值(长度不包含“/0”)。
二、区别
1)strlen函数求的是字符串的实际长度,如果只定义而没有赋初值,那么求得结果是不确定的,他会一直扫描。指导遇到/0字符为止
char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
char aa[10]={'\0'};
cout<<strlen(aa)<<endl; //结果为0
char aa[10]="jun";
cout<<strlen(aa)<<endl; //结果为3
但是sizeof()返回的是变量声明所占内存数,不是实际长度,另外sizeof不是函数,是一个取字节运算符。strlen是函数
sizeof(aa) 返回10
int a[10]; sizeof(a) 返回40 (根据语言int型 c/c++由编译器决定是两个或四个 java 是四个)
char* ss = "0123456789";
sizeof(ss) 结果 4>>>>ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的值所占的空间,应该是长整型的,所以是4
sizeof(*ss) 结果 1>>>> *ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位
char Array[3] = {'0'};
sizeof(Array) == 3;
char *p = Array;
strlen(p) == 1;//sizeof(p)结果为4//这里的p实际是一块内存,因此这是一个昌整型,因此是4
在传递一个数组名到一个函数中时,它会完全退化为一个指针
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1,那么strlen计算到/0的位置位置,那么strlen(ss)=10
sizeof(*ss) 结果 1 ===》*ss 是第一个字符
2、⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是取字节运算符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。