zoukankan      html  css  js  c++  java
  • 数组、字符串长度的计算(转)

    转自:https://blog.csdn.net/duan19920101/article/details/50606351

    常见的计算长度的函数有两个,sizeof()和strlen(),但是,它们之间的差别还是很大的。

    sizeof():主要负责计算数组的长度;

    strlen():主要负责计算字符串的长度。

    (1)sizeof():数组占用字节除以数组类型所占字节,结果为数组元素个数
           使用方法:sizeof(数组名)/ sizeof(数组类型名) 
    (2)strlen():strlen,求字符串有效长度
    方法:strlen(字符数组名)  //结果为字符数组有效字符长度,不包括末尾的''

    注意:当数组作为函数参数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用sizeof和strlen;
    所以,在传址时,应提供2个参数:1、数组名,代表数组首地址;2、数组元素个数,以便确定传递的次数。

    下面来举个例子说明一下,不同情况下sizeof()的用法:

    [cpp] view plain copy
    1. #include<iostream>  
    2. using namespace std;  
    3. void Sum(int array[ ])  
    4. {  
    5. cout<<"sizeof(array)="<<sizeof(array)<<endl;  
    6. }  
    7. void main()  
    8. {  
    9. int a[ ]={1,2,3,4,5,6,7,8,9,10};  
    10. cout<<"sizeof(a)="<<sizeof(a)<<endl;  
    11. Sum(a);  
    12. }  


    运算结果为:sizeof(a)=40   sizeof(array)=4

    看到这样的结果,是不是感觉很奇怪?同样的数组,在不同的位置,输出却不一样。

    分析:当数组作为函数参数传递时,数组名代表的是数组的首址,即指针,而非数组内容。如果传递整个数组,会导致栈溢出的。

    所以在主函数中使用sizeof计算出的是准确的数组长度。而在调用函数中,由于传递的数组不再是数组本身,而是其地址,所以用sizeof计算出的,实际上是数组地址的长度,这时的sizeof(array),实际上是sizeof(int)。

    因此,要想计算实际的数组长度,还是在主函数中求好,要是在调用时想用,可以作为参数传递过去嘛。

    再来看看strlen()的用法:

    若数组为存储字符串的字符数组,即以双引号括起来的字符串整体初始化的字符数组

    例如:char a[]="abcdefg"或者char a[]={"abcdefg"}

    则所求得的长度为字符数组的长度,而不是对应的字符串的长度,要求字符串的长度还需要减1。

    即:字符串长度=字符数组长度-1。

    原因:存储字符串的字符数组末尾有一个''字符,需要去掉它。

    对于char a[]="abcdefg"

    sizeof(a)/sizeof(a[0])=8,要求字符串长度的话应该减1。

    注意:sizeof()在计算时,包括末尾的''

    strlen(a)=7,表示的就是字符串的长度。

    但对于char a[]={'a','b','c','d','e','f','g'}

    sizeof(a)/sizeof(a[0])=7

    部分内容参考:http://blog.sina.com.cn/s/blog_5fd837410100my8a.html

    http://blog.csdn.net/rhzwan123/article/details/2362051

  • 相关阅读:
    JQuery OOP 及 OOP思想的简易理解
    windows下编写shell脚本执行错误
    Kafka常用命令
    OffsetDateTime工具类
    windows下安装consul
    磁盘阵列方案
    shell基本语法记录
    学习CGLIB与JDK动态代理的区别
    Spring源码分析-BeanFactoryPostProcessors 应用之 PropertyPlaceholderConfigurer
    局域网内搭建git
  • 原文地址:https://www.cnblogs.com/Baron-Lu/p/9058570.html
Copyright © 2011-2022 走看看