zoukankan      html  css  js  c++  java
  • 说明sizeof和strlen之间的区别。

    解析:
    由以下几个例子我们说明sizeof和strlen之间的区别。
    第1个例子:

    sizeof(ss)结果为4,ss是指向字符串常量的字符指针。
    sizeof(*ss)结果为1,*ss是第一个字符。
    第2个例子:

    sizeof(ss)结果为11,ss是数组,计算到“”位置,因此是(10+1)。
    sizeof(*ss)结果为1,*ss是第一个字符。
    第3个例子:

    sizeof(ss)结果为100,ss表示在内存中预分配的大小,100×1。
    strlen(ss)结果为10,它的内部实现是用一个循环计算字符串的长度,直到“”为止。
    第4个例子:

    sizeof(ss)结果为400,ss表示在内存中的大小,100×4。
    strlen(ss)错误,strlen的参数只能是char*,且必须是以“”结尾的。
    第5个例子:

    cout<<sizeof(X)<<endl;结果为12,内存补齐。
    cout<<sizeof(x)<<endl;结果为12,理由同上。
    答案:
    通过对sizeof与strlen的深入理解,得出两者区别如下:
    (1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int类型。该类
    型保证能容纳实现所建立的最大对象的字节大小。
    (2)sizeof是运算符,strlen是函数。
    (3)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“”结尾的。
    sizeof还可以用函数做参数,比如:

    输出的结果是sizeof(short),即2。
    (4)数组做sizeof的参数不退化,传递给strlen就退化为指针。
    (5)大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度。这就
    是sizeof(x)可以用来定义数组维数的原因:

    (6)strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型
    占内存的大小。
    (7)sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是
    个操作符而不是个函数。
    (8)当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数
    组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回被动态分配的数组或外部的数组的
    尺寸。
    (9)数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如
    fun(char [8])、fun(char [])都等价于fun(char *)。在C++里传递数组永远都是传递指向数组首
    元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要这样做:进
    入函数后用memcpy将数组复制出来,长度由另一个形参传进去。代码如下:

    (10)计算结构变量的大小就必须讨论数据对齐问题。为了使CPU存取的速度最快(这
    同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时
    经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。
    这样做可能会浪费一些内存,但在理论上CPU速度快了。当然,这样的设置会在读写一些别
    的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof
    得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可。或者如果要按字节存
    储,而不进行数据对齐,可以在Options对话框中修改Advanced Compiler选项卡中的“Data
    Alignment”为按字节对齐。
    (11)sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知
    存储大小数据的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void
    类型等。

    说明sizeof的使用场合。

    答案:
    (1)sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

    (2)用它可以看看某种类型的对象在内存中所占的单元字节。例如:

    (3)在动态分配一对象时,可以让系统知道要分配多少内存。
    (4)便于一些类型的扩充。在Windows中有很多结构类型就有一个专用的字段用来存
    放该类型的字节大小。
    (5)由于操作数的字节数在实现时可能出现变化,建议在涉及操作数字节大小时用
    sizeof代替常量计算。
    (6)如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

  • 相关阅读:
    疲劳原理
    golang中的 time 常用操作
    access与excel
    数据结构正式篇!初探!!
    数据结构复习之C语言malloc()动态分配内存概述
    C语言字符数组与字符串
    数据结构复习之C语言指针与结构体
    c语言数组
    数据结构
    C语言腾讯课堂(一)
  • 原文地址:https://www.cnblogs.com/yihujiu/p/6367160.html
Copyright © 2011-2022 走看看