C++中sizeof()、size()、strlen()、length()详解
1. Size是程序运行时计算的函数,用于查找数组或容器中元素的数量。
在字符串中,它的效果与
2.是一个运算符,结果是求出对应参数的字节大小,其值是在编译时计算出来的。所以它不能用来计算动态分配的内存空间的大小。
两者的关系:size(某个数组)=(某个数组)/size(数组类型)
3.它是一个函数,程序运行时会进行计算。它的参数必须是字符指针(char *)。当字符数组名称作为参数传入时,字符数组实际上退化为指针。该函数返回字符串的长度,不包括结尾标志 \0
4.它是一个函数。 C++中的()函数只能用来获取字符串的长度,不包括\0。
情况1:size()或()查找数组元素个数和字节大小
#include
#include
using namespace std;
int main() {
//整型数组
int num[5] = {1, 2, 3, 4, 5};
cout << "num=0x" << num<< endl //输出为起始内存地址,num+1为数组初始地址+数据大小,逐个输出要for循环num[i]
<< "sizeof(int)=" << sizeof(int)<<endl //sizeof运算符用于求数据类型或变量占用的内存空间
<< "sizeof(num)=" << sizeof(num) << endl
<< "size(num)= "<< size(num) << endl
<< "sizeof(num) / sizeof(int)="<< sizeof(num) / sizeof(int) << endl<<endl;
//字符串数组
string character1[6] = {"1", "5a", "6", "6","l"}; // string类型,32位占4G,64位占1G
cout << "character1=0x" << character1<< endl //输出为起始内存地址
<< "sizeof(string)=" << sizeof(string) << endl //字符串(string)不是C++的基本数据类型,用sizeof求它占用内存的大小没有意义
<< "sizeof(character1)=" << sizeof(character1) << endl
<< "size(character1)= " << size(character1) << endl
<< "sizeof(character1) / sizeof(string)=" << sizeof(character1) / sizeof(character1) << endl<<endl;
//字符数组
char character2[5] = {'1', 'a', 'b', 'a5','5\0'};//超出只保留最后一位,且没有"\0"会一直寻找直至找到"\0",导致内存疯狂占用,所以数组每次使用前进行初始化
cout << "character2=" << character2 << endl
<< "sizeof(char)=" << sizeof(char) << endl
<< "sizeof(character2)=" << sizeof(character2) << endl
<< "size(character2)= " << size(character2) << endl
<< "sizeof(character2) / sizeof(string)="
<< sizeof(character2) / sizeof(character2) << endl;
}
执行结果:
num=0x000000186F0FF548
sizeof(int)=4
sizeof(num)=20
size(num)= 5
sizeof(num) / sizeof(int)=5
character1=0x000000186F0FF580
sizeof(string)=40
sizeof(character1)=240
size(character1)= 6
sizeof(character1) / sizeof(string)=1
character2=1ab5
sizeof(char)=1
sizeof(character2)=5
size(character2)= 5
sizeof(character2) / sizeof(string)=1
情况2:()求字符串的长度
#include
#include
#include
using namespace std;
int main() {
//浮点型
float float1 = 0.568416996;//超出部分四舍五入,32位系统下,6~7位有效数字,6精度可以保证
double double1 = 0.23564876824368;//32位系统下,15~16位有效数字,15精度可以保证
long double ldouble1 = 36.256523564876824368;
cout
<< "float1=" << float1 << endl // cout默认六位精度
<< "float1=" << setprecision(8) << float1 << endl // 改成8精度,使用setprecision,头文件#include,但第7位后就会出现错误
<< "float1=" << fixed << setprecision(9)<< float1 // 加了fixed意味着是固定点方式显示,所以这里的精度指的是小数位6位
<< " sizeof(float1)=" << sizeof(float1) << endl
<< endl; // cout默认六位精度
cout << "double1=" << double1<< endl
<< "float1=" << setprecision(8) << double1<< endl
<< "float1=" << fixed << setprecision(6) << double1
<< " sizeof(double1)=" << sizeof(double1) << endl
<< "ldoble1=" << ldouble1 << " sizeof(1double1)=" << sizeof(ldouble1)<<endl //long double的小数点控制同上
<< endl;
//字符、字符串
string string1 = "wp#@";
char char1 ='W';
cout << "string1="<<string1<<endl
<< "size(string1)=" << size(string1) << endl
<< "sizeof(string1)=" << sizeof(string1) <<endl<<endl//输出4*7=28,单个字符占7位,string内存位不固定?
<< "char1=" << char1 << endl // size不能用于非数组非容器,string可用
<< "size(char1)=" << sizeof(char1) << endl;
}
输出结果:
float1=0.568417
float1=0.56841701
float1=0.568417013 sizeof(float1)=4
double1=0.235648768
float1=0.23564877
float1=0.235649 sizeof(double1)=8
ldoble1=36.256524 sizeof(1double1)=8
string1=wp#@
size(string1)=4
sizeof(string1)=40
char1=W
size(char1)=1