1、sizeof()--求所占的字节数
字节数就是指数据存在计算机里花了多少字节,比如说一个int类型所占字节数是4,char类型所占字节数为1;int* (整型指针所占字节数为4),char*(字符指针所占字节数也为4)
有了这个背景,那么以下的程序就比较好理解了:
(1)、对于整型字符型数组
int A[]={1,4,5,2,8,6,0};
//求整型数组A所占的字节数
int i=sizeof(A);//i表示整型数组A所占的总空间的字节数
cout<<” i=sizeof(A)= ”<<i<<endl;//此时,i=7*4=28
i=sizeof(A)/sizeof(int);//此时i表示数字数组的元素个数 i=7
char B[]={'a','b','c'};
i = sizeof(B);
cout<<i<<endl;//结果为3*sizeof(char)=3
//求字符数组的元素个数
i=szieof(B)/sizeof(char); //结果为3
char C[]="abcde";
i = sizeof(C);
cout<<i<<endl;//结果为6*sizeof(char)=6,最后一个为’\0’
(2)、对于整型或字符型指针
int *p;
int A[]={1,2,3,4,5};
p=A;
int i= sizeof(p);// i=4;p为整形指针,大小为定值为4
int i = sizeof(*p);//i=4;此时i就是p所指的整型数组A的第一个元素A[0]的所占字节数
2、strlen()---字符数组或者字符串所占的字节数
strlen()函数可以看作是一个计数器,从某一位置开始,一直到碰到第一个字符串结束符‘\0’为止。它返回的是字符串或者字符数组的实际长度。
(1)字符数组
char A[4]={'a','b','\0','c'};
I = A.strlen();//I为2,因为它遇到‘\0’就结束了。
char *str="abcde";
i=strlen(str); //i为5
cout<<i<<endl;
(2)字符指针
char C[]={"abcdef"};
char *p1=C;
i=strlen(p1); //结果为6
cout<<i<<endl;
⚠️注意:
char B[]={'a','f','g','h'};
i = B.strlen();//这时候是会报错的,因为B没有指定内存分配大小。
char D[5]={'a','c','q','f','w'};//这样再用strlen求其长度也会造成错误,当D[]之中的数大于5才不会造成错误。
cout<<i<<endl;
可以这么理解,strlen()这个计数器一直没有遇到它生命当中的那个人'\0',并且上帝也没有给它一个进度条,所以它对于这样的生活是无比绝望的。
(3)其他类型
class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; //结果 12 ===>内存补齐
cout<<sizeof(x)<<endl; //结果 12 同上
class X
{
static int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; //结果 8 ===>static这一静态变量是存放着全局数据区的,而sizeof 计算的是栈中分配的大小
(4)空类
class A
{};
class A2
{};
class B:public A
{};
class C:public virture B
{};
class D:public A,public A2
{};
int main()
{
cout<<"sizeof(A): "<<sizoef(A)<<endl;
cout<<"sizeof(B): "<<sizeof(B)<<endl;
cout<<"sizeof(C): "<<sizeof(C)<<endl;
cout<<"sizeof(D): "<<sizeof(D)<<endl;
return 0;
}
结果:1 1 4 1
表明空类所占空间为1个字节,单一继承的空类空间也为1,多重继承的空类空间还是1,但虚继承涉及虚表(虚指针),所以sizeof(C)为 4。
3、sizeof()和strlen()的区别
sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
4、c++当中字符串string的长度
string str1=”cbdsj”;
int i=str1.length();
cout<<”i=str1.length()= ”<<i<<endl; //结果为5
I=str1.size();
cout<<”str1.size()= ”<<i<<endl; //结果为5
总的来说:对于c++中的size()和lengt()没有区别。
⚠️注意:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str("how soft works行");
cout << "Length of str : " << str.length();
return 0;
}
大家可以把这段程序自己编译运行一下,可能会得到不同的结果。
我的结果是:17,但是有些人的结果是16。这个的原因是因为字符串里出现了中文。和开发环境有关系了,UTF8是3个字节一个汉字的,那么就是17,ANSI就是16。
总结一下:
- sizeof()是运算符,其他三个都是函数,其中size()和length()是C++string里面涉及到的函数,在STL当中会经常使用到。
- strlen()遇到‘\0’,才会停止计数