zoukankan      html  css  js  c++  java
  • C++基础系列六:sizeof 操作符

    sizeof 操作符的作用是返回一个对象或类型名的长度,返回值的类型是size_t。size_t是标准库中的类型,定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本,它是一个与机器相关的unsigned类型,其大小足以保证存储内存中的对象的大小。

    (1)sizeof 操作符的用法

    sizeof的结果是编译时常量,它的使用有三种形式:

    a. sizeof (type name)

    b. sizeof (expr)

    c. sizeof expr

    b,c中返回的结果都不是expr的值,而是expr的结果的类型的长度,因此,对于sizeof *p,即使p指向一个无效地址,结果也是合法的,因为他计算的是p指向的对象对应的类型长度。

    sizeof的结果与类型的关系:

    i. 对char类型或者值为char类型的表达式做sizeof的结果都为1;

    ii. 对引用类型做sizeof操作的结果将返回存放此引用类型对象所需的内存空间的大小;

    iii. 对指针做sizeof操作将返回存放指针所需的内存大小;如果要获取指针所指向对象的类型大小,则必须对指针解引用;

    iv. 对数组做sizeof操作等效于对其元素类型做sizeof的结果乘上数组元素的个数。

    示例代码如下:

     1 #include<iostream>
     2   using namespace std;
     3   #include<cstdlib>
     4   
     5   void GetLengthInnerType()
     6   {
     7       size_t cRes = sizeof (char);
     8       size_t bRes = sizeof (bool);
     9       size_t wcRes = sizeof (wchar_t);
    10       size_t iRes = sizeof (int);
    11       size_t lRes = sizeof (long int);
    12       size_t fRes = sizeof (float);
    13       size_t dRes = sizeof (double);
    14       size_t ldRes = sizeof (long double);
    15       
    16   
    17       cout<<"char:"<<cRes<<endl<<"bool:"<<bRes<<endl<<"wchar_t:"<<wcRes<<endl<<"int:"<<iRes<<endl
    18           <<"long:"<<lRes<<endl<<"float:"<<fRes<<endl<<"double:"<<dRes<<endl<<"long double:"<<ldRes<<endl;
    19   }
    20   
    21   void main()
    22   {
    23       GetLengthInnerType();
    24   
    25       int a = 2;
    26       double b = 4.1;
    27   
    28       int& aa = a;
    29       double& bb = b;
    30   
    31       cout<<"sizeof aa:"<<sizeof aa<<endl;
    32       cout<<"sizeof bb:"<<sizeof bb<<endl;
    33   
    34       int* pa = &a;
    35       double* pb = &b;
    36   
    37       cout<<"sizeof pa:"<<sizeof pa<<endl;
    38       cout<<"sizeof pb:"<<sizeof pb<<endl;
    39   
    40       cout<<"sizeof *pa:"<<sizeof *pa<<endl;
    41       cout<<"sizeof *pb:"<<sizeof *pb<<endl;
    42   
    43       system("pause");
    44   }
    View Code

     上面的代码执行结果:

    char:1
    bool:1
    wchar_t:2
    int:4
    long:4
    float:4
    double:8
    long double:8
    sizeof aa:4
    sizeof bb:8
    sizeof pa:4
    sizeof pb:4
    sizeof *pa:4
    sizeof *pb:8
    View Code
    View Code

    (2)sizeof和strlen的区别

    strlen执行的是一个计数器的工作,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符''为止,然后返回计数器值。

    sizeof是操作符,它以字节的形式给出了其操作数的存储大小,操作数可以是类型也可以是表达式,操作数的存储大小由操作数的类型决定。

    二者的区别可以概括如下:

    a. sizeof 后如果是类型,则必须加括号,如果是表达式,则不需要;strlen是函数,必须有括号。

    b. sizeof 返回值为size_t,它在头文件中typedef为unsigned int类型,该类型保证能够容纳所建立的最大对象的字节大小;strlen返回值为int类型。

    c. sizeof 的操作数可以为类型,或者函数,为函数时返回的是函数返回值类型的大小;而strlen参数则必须为以''结束的char*类型的字符串。

    d. 用数组名做sizeof 参数时不退化,而如果作为strlen参数就退化为指针,如下的代码:

    1 char a[10] = {'c'};
    2 size_t m = sizeof a;//result:10
    3 int n = strlen(a);//result:1

    e. sizeof 在编译的时候计算,因而可以用sizeof(expr)定义数组维数,而strlen则是在运行期计算。

    f. sizeof 不能返回动态数组的大小,strlen只关心数组实际的内容,如下代码:

    1 char* parr = new char[10];
    2 cout<<"strlen(parr):"<<strlen(parr)<<endl; 
    3 cout<<"sizeof parr:"<<sizeof parr<<endl;  
    4 cout<<"sizeof *parr:"<<sizeof *parr<<endl;

    得到的结果如下,根据strlen计算的原理,不能确定strlen(parr)的值,因为无法确定字符串终止的位置,所以得到的是一个随机值;而使用sizeof parr时,parr为指针,故而结果为4;parr解引用得到的是第一个字符,所以sizeof *parr返回的是第一个字符的类型大小,即为1.

    strlen(parr):24
    sizeof parr:4
    sizeof *parr:1
  • 相关阅读:
    C#的集合类(二)Hashtable、SortedList、Dictionary
    下载文件-JavaScript
    ASP.NET(C#)图片加文字、图片水印
    C# DataTable 互转 List<T>
    C# 将 DataTable 转 List<T>、首行转 T
    C# 金额转中文大写
    监听端口守护进程
    数据库操作的九大步骤
    日志方法
    sqlserver 查找所有子级
  • 原文地址:https://www.cnblogs.com/sophia-yun/p/3155667.html
Copyright © 2011-2022 走看看