sizeof和strlen的一些理解

来源:互联网 发布:网络运营公司经营范围 编辑:程序博客网 时间:2024/05/16 02:11

最近又一次看到sizeof运算符和strlen函数,感觉有点忘了,就打开《C++primer》研究一下,这里做下记录,以后忘记可以随时查看,比较方便。

1 sizeof的定义
首先,sizeof运算符返回一条表达式或一个类型名字所占用的字节数。sizeof运算符满足右结合律,其所得的值是一个size_t类型。size_t类型是一种机器相关的无符号类型,它设计的足够大以便能够表示内存中任意对象的大小。在cstddef头文件定义(即C标准库stddef.h头文件的C++语言版本)。

2 sizeof的作用类型
a 对char或者类型为char的表达式执行sizeof运算,结果得1。例如:

    char a = '0';    std::cout<<sizeof(a);  //结果是1

b 对引用类型执行sizeof运算得到被引用对象所占空间的大小。例如:


c 对指针执行sizeof运算得到指针本身所占空间的大小。例如:


d 对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得的结果求和。注意。sizeof运算符不会把数组转换成指针来处理。例如:

    int *a = new int[50];    int b[50];    std::cout<<sizeof(a)<<'\t'<<sizeof(b);  //结果是4  200

虽然在C++语言中,指针和数组有着紧密联系,实际使用数组时编译器一般会把数组转换成指针,如上例子中变量b本身代表指向数组b[50]的第一个数的指针,但是sizeof运算符不会把数组转换成指针来处理,因此得到的结果是4*50=200,而a显式的定义为指针,因此sizeof计算的就是指针所占的字节数4。( 这里注意一下,a和b的操作都可以用a[0]和b[0]或者*(a+1)和*(b+1)来操作,但是如果使用++运算符,则*(a++)正确,但是*(b++)报错。说明b是常量指针。)

根据这样一个性质,经常使用

sizeof(b)/sizeof(*b)
来计算数组的长度。

e 对string和vector对象执行sizeof运算只返回给类型固定部分的大小,不会计算对象中的元素占了多少空间。例如:


3 strlen的定义

strlen则是计算字符串中有效字符数(不包含'\0')。例如:

    char *p1="Hello";    char p2[]="Hello"; //等价于p2[]={'H','e','l','l','o','\0'};    char p3[]={'H','e','l','l','o'};    std::cout<<sizeof(p1)<<'\t'<<sizeof(p2)<<'\t'<<sizeof(p3)<<std::endl; // 4 6 5    std::cout<<strlen(p1)<<'\t'<<strlen(p2)<<'\t'<<strlen(p3)<<std::endl; // 5 5 10
sizeof在计算p1时因为是显式的指针,因此为4,p2因为编译器赋值会自动补'\0',因此计算为6,p3时因为直接显示赋值,因此为5。

strlen在计算p1和p2时都是当成字符数组来计算,而且不包含'\0',因此计算为5,而p3则遇到'\0'才结束计算,我们没有显示给出'\0',因此出来的值是不确定的。




1 0
原创粉丝点击