@zsh-o
2018-08-16T19:53:15.000000Z
字数 1110
阅读 965
算法
编程
memset
limits.h
头文件里面有定义各种范围的最大值和最小值,也可以自己定义
但用memset
初始化数组时要特别注意,memset
是按照字节来处理的,也就是说赋值的范围为[0x00,0xff]
,当设定为0xff
时:memset(A, 0xff, sizeof(A))
时,A
数组中所有元素为-1
,所以当我们需要把数组初始化一个很大的值或者很小的值时需要:
memset(A, 0x7f, sizeof(A))
,int
型第一位为符号位,很大的值为正数,所以第一位为剩余位为memset(A, 0x80, sizeof(A))
,补码表示,位最小负数为0b1000000 = 0x80
memset(A, 0x00, sizeof(A))
#include <iostream>
#include <cstring>
#include <limits>
using namespace std;
const int MAXSIZE = 1000;
int A[MAXSIZE];
int B[MAXSIZE];
const int MY_INT_MAX = 0x7fffffff;
const int MY_INT_MIN = 0x80000000;
int main(){
cout<<INT_MAX<<endl; //2147483647
cout<<INT_MIN<<endl; //-2147483648
cout<<MY_INT_MAX<<endl; //2147483647
cout<<MY_INT_MIN<<endl; //-2147483648
memset(A, 0x7f, sizeof(A));
memset(B, 0x80, sizeof(B));
printf("%d\n", A[0]); //2139062143
printf("%d\n", B[0]); //-2139062144
}
sizeof()
sizeof
只返回类型的字符数,这里需要注意的是数组的申明,int A[L]
这种声明方式相当于声明了一种整形数组类型,其可以用memset(A, 0x00, sizeof(A))
进行初始化,但int* A = new int[L]
中的A是个整形指针类型,这时sizeof(A)
返回的是整形指针大小,故此时初始化应该用memset(A, 0x00, sizeof(int) * L)
#include <stdio.h>
#include <string.h>
int main(){
int A[100];
A[0] = 4;
int* p = A;
printf("%d %d\n", A[0], p[0]);
printf("%d %d\n", sizeof(A), sizeof(p));
}
4 4
400 4