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。这样就可以将数组初始化为一个很小的数了。

原文地址:https://www.cnblogs.com/flyingrun/p/13462783.html