sizeof/strlen/length

1.sizeof()

  sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
  它的功能是:获得保证能容纳实现所建立的最大对象的字节大小
  由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值对象、结构、数组所存储的内容没有关系
  具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
  数组——编译时分配的数组空间大小,不退化为指针
  指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,为4);
  类型——该类型所占的空间大小;
  对象——对象的实际占用空间大小;
  函数——函数的返回类型所占的空间大小(函数的返回类型不能是void)。

2.strlen()

  strlen(...)是函数要在运行时才能计算。参数必须是字符型指针(char*),且必须是以‘‘\0‘‘结尾的。当数组名作为参数传入时,实际上数组就退化成指针了
  它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL,返回的长度大小不包括NULL

3.length()

  length( )和size( )返回字符串中的字节数。length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,以便用于STL的算法。string类的size()/length()方法返回的是字节数不管是否有汉字

相关测试代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

int main()
{
    string s = "abcde";                       // string被字符串赋值后只包含字符串本身,不包括‘\0‘
    char ch1[] = "abcde";                     // ch1[5] = "abcde"  -----------------------> ERROR
    char ch2[] = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘};   // ch2[5] = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘}  -----> RIGHT

    printf("s.length() = %d\n", s.length());              // s.length()  = 5
    printf("sizeof(ch1) = %d\n", sizeof(ch1));            // sizeof(ch1) = 6
    printf("sizeof(ch2) = %d\n\n", sizeof(ch2));          // sizeof(ch2) = 5

    /*----------------------------- 以上区别字符串和字符数组 -----------------------------------
      ------------------------------------------------------------------------------------------*/

    string str[5] = {"I", "am", "fine", "thank", "you"};

    printf("sizeof(char) = %d\n", sizeof(char));              // 1
    printf("sizeof(string) = %d\n\n", sizeof(string));        // 4

    printf("sizeof(ch2) = %d\n", sizeof(ch2));                // 5   ----> 数组名不会退化为指针
    printf("sizeof(str) = %d\n\n", sizeof(str));              // 20  ----> 数组名不会退化为指针

    printf("sizeof(ch2[0] = %d\n", sizeof(*ch2));             // 1
    printf("sizeof(str[0]) = %d\n\n", sizeof(*str));          // 4   ----> 指针所指向字符所占用空间

    /*----------------------------- 以上string[]和char[]共同点 ---------------------------------
      ------------------------------------------------------------------------------------------*/

    char *ch4 = "0123456789";
    char ch3[20] = "0123456789";

    printf("sizeof(ch4) = %d\n", sizeof(ch4));          // sizeof(ch4) = 4  ----> 计算的是指针所占空间
    printf("sizeof(ch3) = %d\n", sizeof(ch3));          // sizeof(ch3) = 20 ----> 数组名不会退化为指针
    printf("strlen(ch3) = %d\n\n", strlen(ch3));        // strlen(ch3) = 10 ----> 数组名退化为指针

    printf("strlen(ch1) = %d\n", strlen(ch1));          // strlen(ch1) = 5  ----> 定值,ch1以‘\0‘结尾
    printf("strlen(ch2) = %d\n\n", strlen(ch2));        // strlen(ch2) = 10 ----> 不定值,ch2没以‘\0‘结尾

    /*----------------------------- 以上sizeof, strlen使用特点 ---------------------------------
      ------------------------------------------------------------------------------------------*/

    string ss = "你好世界";
    printf("ss.size() = %d\n", ss.size());                // ss.size()   = 8
    printf("ss.length() = %d\n", ss.length());            // ss.length() = 8

    /*----------------------------- 以上C++中string类求长度方法 ---------------------------------
      ------------------------------------------------------------------------------------------*/
    return 0;
}
时间: 2024-12-09 04:43:48

sizeof/strlen/length的相关文章

sizeof &amp;&amp; strlen 的区别

本文主要记录了 sizeof 操作符 和 strlen() 函数的区别,以及各自的用途.(在下才疏学浅,发现错误,还请留言指正) sizeof 和 strlen 的区别 示例代码如下: #include<stdio.h> int main() { char str[20]="0123456789"; printf("strlen(str)==%d\n",strlen(str));//计算字符串的长度(不包括0x00),结果:10 printf("

sizeof和strlen, length的区别

一.sizeof    sizeof(...)是运算符,而不是一个函数.    一个简单的例子:int a;cout<<sizeof a<<endl;    在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.    实际上,用sizeof来返回类型以及静态分配的对象.结构

sizeof, strlen区别

strlen与sizeof的区别 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. 2.sizeof是算符,strlen是函数. 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的. 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了. 5.大部分编译程序在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是siz

sizeof strlen strncpy

sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 int main() 5 { 6 char *p="wangddd"; 7 printf("%d\n",sizeof(p));//输出4,指针类型 8 9 char x[8]; 10 printf("%d

关于SizeOf、Length

结论: 到底什么时候用Length,SizeOf呢,我总结下使用Length,Sizeof的场景 1.Length(静态数组或动态数组)----没有问题 2.Length(string/shortstring/ansistring/utf8string) --- 任何string都不能用,以防错误,那么该如何计算一个字符串中字符的个数呢,用我师傅的CharCountA/w/u如下图: 3.SizeOf(静态数组) ---- 返回数组占用的总的字节数如:array[0..5] of Byte ;

sizeof strlen 详解

详解sizeof和strlen 1 说明sizeof和strlen之间的区别 (1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsinged int类型.该类型保证     能容纳实现所建立的最大对象的字节大小. (2)sizeof是算符,strlen是函数. (3)sizeof可以用类型作参数,sizeof还可以用函数作参数. strlen只能用char*作参数,且必须是以'\0'结尾的.比如: short f(); printf("%d\n",si

转移字符----sizeof &amp; strlen

在定义了数组大小时: sizeof是运算符,表示编译时分配的空间大小,即数组定义的大小,char t[20] = "sfa".sizeof: 20; strlen: 3.在未定义数组大小时: sizeof根据实际位数确定,注意字符串隐藏的\0也算一位.char s[] = "a\128\\\tcb\xdg\n";sizeof计算s大小时,为11位:a \12 8 \\ \t c b \xd g \n \0strlen计算s大小时,为10位:strlen计算字符串长度

delphi 判断一个数组的长度用 Length 还是 SizeOf ?

判断一个数组的长度用 Length 还是 SizeOf ?最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是一个字节, 这样用看不出错误, 譬如:  -------------------------------------------------------------------------------- vararr1: array[0..9] of Char;arr2: array[0..9] o

strlen函数细节

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值. 原型: extern unsigned int strlen(char *s); 在Visual C++ 6.0中,原型为size_tstrlen(const char *string); ,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned