zoukankan      html  css  js  c++  java
  • sizeof、strlen、length、size

    sizeof:sizeof(),他的参数可以是数组、指针、类型、对象、函数等。他是一个运算符,用来计算这个参数的所占的总的字节数。

    strlen:strlen(),他的参数必须是字符型指针(char*),当数组名作为参数传入时,实际上数组就退化成指针了。他是一个函数用来返回这个参数中字符串的长度。我们来比较一下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int five()
     5 {
     6     return 0;
     7 }
     8 
     9 int main()
    10 {
    11     char one[20] = "1234567890";
    12     char *two = "9234567890";   //9234567890存储在常量区,two在栈上。下面解释
    13     int three = 5;
    14     string four = "1234567890";
    18     cout << "sizeof(数组) = " << sizeof(one) << endl          //计算了参数占的总字节数
    19         << "sizeof(字符型指针) = " << sizeof(two) << endl    //存储地址占了8个字节
    20         << "sizeof(字符型指针) = " << sizeof(*two) << endl   //存储了一个字符,占了一个字节
    21         << "two = " << two << endl
    22         << "*two = " << *two << endl
    23         << "sizeof(整型) = " << sizeof(three) << endl
    24         << "sizeof(字符串) = " << sizeof(four) << endl
    25         << "sizeof(函数) = " << sizeof(five()) << endl << endl;
    26 
    27     cout << "strlen(数组) = " << strlen(one) << endl          //返回参数中字符串所占的大小,遇到结束
    28         << "strlen(字符型指针) = " << strlen(two) << endl
    29 /*        << "strlen(整型) = " << strlen(three) << endl   //这三个报错,不能作为strlen的参数
    30         << "strlen(字符串) = " << strlen(four) << endl
    31         << "strlen(函数) = " << strlen(five()) << endl*/ << endl;
    32 34     return 0;
    35 }

    结果为:

    sizeof(数组) = 20
    sizeof(字符型指针) = 8
    sizeof(字符型指针) = 1
    two = 9234567890
    *two = 9
    sizeof(整型) = 4
    sizeof(字符串) = 32
    sizeof(函数) = 4
    
    strlen(数组) = 10
    strlen(字符型指针) = 10

    length、size:

    这两个函数一样。 string类的size()/length()方法返回的是字节数,不管是否有汉字。

    解释一下上面代码中遇到的问题:

    char  *s ;
    
    s = "China";
    char  *s = "China";

    上面这两种是一样的。为什么可以把一个字符串赋给一个指针变量。。这不是类型不一致吗???C++中编译器会给字符串常量分配地址,如果 "China", 存储在内存中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005 。。。。s = "China" ,意思是什么,对了,地址。其实真正的意义是 s ="China" = 0x3000;看清楚了吧 ,你把China 看作是字符串,但是编译器把它看作是地址 0x3000,即字符串常量的本质表现是代表它的第一个字符的地址。。。。。。。。。。s = 0x3000这样写似乎更符合直观的意思。。。所以上面的我们two就是“9234567890”的首地址,而*two其实是一个字符的值。所以当打印two就相于数组的首地址一样打印出来整个字符串。而*two打印的是一个值。而为什么sizeof(two)打印出来是8呢,因为他是一个运算符,只计算这个地址所占的字节数,而strlen是函数,返回的是字符串的长度。


    具体了解:https://m.imooc.com/article/30475

  • 相关阅读:
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    云架构师进阶攻略(3)
    PAT 1059. C语言竞赛
    PAT 1058. 选择题
  • 原文地址:https://www.cnblogs.com/xiaodangxiansheng/p/10950161.html
Copyright © 2011-2022 走看看