在使用程序进行解决问题时,时常需要将一些变量初始化为一个极大值,比如说无限大+∞,但是计算机的存储空间是有限的,不可能存储一个无限大的数,所以一般采用0x3f3f3f3f作为一个极大值来代表无限大。
int m = 0x3f3f3f3f;
printf("%d", m);
输出:
1061109567
//是一个很大的数,可以用来代表+∞;
//并且以该值代表+∞,+∞ + +∞也不会超出范围;
//是一个比较理想的代替+∞的数值;
上述内容很容易理解,当我们对一个数组进行初始化时,可以使用memset()函数。
【一维数组】
全为“0”:
int a[10];
memset(a, 0, sizeof a);
for(int i = 0; i < 10; i ++)
printf("%d ", a[i]);
输出:
0 0 0 0 0 0 0 0 0 0
全为“0x3f3f3f3f”:
int a[10];
memset(a, 0x3f3f3f3f, sizeof a);
for(int i = 0; i < 10; i ++)
printf("%d ", a[i]);
输出:
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
【二维数组】
全为“0x3f3f3f3f”:
int a[10][10];
memset(a, 0x3f3f3f3f, sizeof a);
for(int i = 0; i < 10; i ++){
for(int j = 0; j < 10; j ++)
printf("%d ", a[i][j]);
printf("\n");
}
输出:
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
#!#!#!对数组使用memset()函数初始化为最大值还有一种办法:
【一维数组】
#将memset(a, 0x3f3f3f3f, sizeof a);中的0x3f3f3f3f改为0x3f#
同样也可达到效果。
全为“0x3f3f3f3f”:
int a[10];
memset(a, 0x3f, sizeof a);
for(int i = 0; i < 10; i ++)
printf("%d ", a[i]);
输出:
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
【二维数组】
全为“0x3f3f3f3f”:
int a[10][10];
memset(a, 0x3f, sizeof a);
for(int i = 0; i < 10; i ++){
for(int j = 0; j < 10; j ++)
printf("%d ", a[i][j]);
printf("\n");
}
输出:
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567
此时,有些同学可能就搞混了,难道“0x3f”也代表无穷大吗?
我们来看看0x3f、0x3f3f、0x3f3f3f、0x3f3f3f3f分别等于多少:
int a, b, c, d;
a = 0x3f;
b = 0x3f3f;
c = 0x3f3f3f;
d = 0x3f3f3f3f;
printf("%d\n%d\n%d\n%d", a, b, c, d);
输出:
63
16191
4144959
1061109567
所以“0x3f”其实等于63,那为什么这个值使用在memset()函数中,作用相当于“0x3f3f3f3f”呢?
是因为memset()是对char操作,即一个字节一个字节的操作,如果此时初始化的变量a为int类型(4字节),那么:
memset(a, 0x3f, sizeof a);
//0x是十六进制的意思;
其实是对a的每一个字节初始化为“3f”,这样a的4个字节都为“3f”,a的值为“3f3f3f3f”
参考资料: