zoukankan      html  css  js  c++  java
  • C++中求数组长度与memset的用法

    1 在有数组作为参数的函数里,这个时候的参数已经不是数组,而是“指针”

      总所周知,在C++中我们通过sizeof(arr)/sizeof(arr[0])来获取数组arr的长度。但是当数组作为函数参数时,不能再使用sizeof(arr)来获取数组的总大小,或者使用sizeof(arr)/sizeof(arr[0])来获取数组的长度。如果要获取数组的长度,那么只能加一个长度参数m

    void testFun(int num[], int m){
        int num_2[10];
        // 这时获取的是数组大小
        int length_2 = sizeof(num_2)/sizeof(num_2[0]);
        // 这时获取的是指针大小
        int length = sizeof(num)/sizeof(num[0]);
    }
    
    
    

    2 memset函数用来随意赋值,它是将数字以单个字节逐个拷贝的方式存放到指定的数组内存中

    int main(){
        int dp[100];
        memset(dp, 0, sizeof(dp));
        // 00000000 00000000 000000000 00000000
    }
    

      int类型的变量一般占用4个字节,对每一个字节赋值0的话就变成了“00000000 00000000 000000000 00000000” (即10进制数中的0)

    赋值为-1的话,放的是 “11111111 11111111 11111111 11111111 ”(十进制的-1)。

      如果设置赋值为1呢?这个时候就不是想当然的全部为1了,而是“00000001 00000001 00000001 00000001”。

    int main(){
        int dp[100];
        memset(dp, 1, sizeof(dp));
        // 00000001 00000001 00000001 00000001
    }
    

      我们在很多程序中都会看到memset(a,127,sizeof(a))这样的代码,127是什么特别的数字呢?通过基础的进制转换可以得知127的二进制表示是01111111,那么在dp数组里放的内容就是01111111 01111111 01111111 01111111,(10进制的2139062143),这样就实现了将数组里的全部元素初始化为一个很大的数的目的了,在最短路径问题以及其他很多算法中都是需要用到的。值得注意的是,int类型的范围为2^31-1,大约是2147483647,所以初始化int类型的数组也可以使用127这个数值。

      如果是128呢?因为128的二进制是10000000,那么放的内容就是10000000 10000000 10000000 10000000,经过计算可得这个数是-2139062144。这样就可以将数组初始化为一个很小的数了。

  • 相关阅读:
    打印杨辉三角C语言小程序
    奇怪的比赛蓝桥杯
    (转)Silverlight CoreCLR结构浅析
    试一试!
    (转)使用自定义行为扩展 WCF
    分组合并的使用
    多进程,多线程(转载)
    在 ASP.NET 网页中不经过回发而实现客户端回调(需要实现ICallbackEventHandler接口)
    读书笔记
    WCF学习笔记3(客户端内部运行机制分析)
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13462783.html
Copyright © 2011-2022 走看看