C++数组初始化memset和fill
前言
C++中数组的初始化
一、静态初始化
int main()
{
// 静态数组arr
int arr[10];
// 将数组所有元素初始化为0
//memset(arr,0,sizeof(arr));
//fill(arr,arr+10,0);
// 遍历输出数组元素
for(int i=0;i<10;++i){
cout << arr[i] << endl;
}
return 0;
}
- 静态数组使用memset(arr,0,sizeof(arr)),可以把数组元素都设置为0。
- 也可以memset(arr,-1,sizeof(arr)),设置为-1,其他数则不行。二维数组也可使用memset(arr,0//-1,sizeof(arr));设置
- 使用fill函数可以设置为任何数。
二、动态初始化
int main()
{
// 动态数组arr
int* arr=new int[10];
// 将数组所有元素初始化为0
//memset(arr,0,sizeof(arr));
//fill(arr,arr+10,0);
// 遍历输出数组元素
for(int i=0;i<10;++i){
cout << arr[i] << endl;
}
return 0;
}
- int* arr = new int[10]();可以设置数组元素为0。注意:括号内啥都不能有,否则报错!!!
- 使用memset(arr,0,sizeof(arr))不能将所有数组元素设置为0,原因是arr是一个指针,而指针的长度只能是8个字节(64位系统),最终结果只能保证使用memset设置前两个元素为0或-1。
- 使用memset(arr,0//-1,10*sizeof(int))可以设置0或-1。二维数组使用memset(arr,0,sizeof(arr));
- 使用fill函数可以设置为任何数。
总结
int main()
{
// 动态数组arr
int* arr = new int[10]();
cout<<sizeof(arr)<<endl;
// 将数组所有元素初始化为0或-1
//memset(arr,-1,sizeof(arr));//不能这样写,搞清楚arr是指针,size为8(64位系统)
//fill(arr,arr+10,9);
// 遍历输出数组元素
for(int i=0;i<10;++i){
cout << arr[i] << endl;
}
cout<<endl<<endl;;
int *pp = arr;
printf("%p\n",pp);
printf("%p\n",arr);
int x[10] = {1,2,3,4,5,6,7,8,9,0};
int *p ;
p = x;
printf("x的地址为:%p\n",x);
printf("x[0]的地址为:%p\n",&x[0]);
printf("p的地址为:%p\n",&p);
cout<<endl<<endl;;
int m = 7,n = 9;//new一个m行n列的数组并初始化为0;
int** arr2 = new int*[m];//表示一个包含m个元素的数组,数组元素都是指向int的指针
for(int i = 0;i < m;i++){
arr2[i] = new int[n];
cout<<"sizeof(arr): "<<sizeof(arr2[i])<<" ";
memset(arr2[i],0,sizeof(int)*n);//sizeof(int)*n,,,,arr2[i])这里是错误的!!!因为arr[i]是指针类型的,sizeof()显示指针大小为8
fill(arr2[i],arr2[i]+n,5);//如果用new,只能每一维数组单独使用memset或者fill,fill第一个参数要写arr2[i],才或者&arr2[i][0]
}
cout<<endl;
//fill(arr2[0], arr2[0]+n*m, 4);//这里是错误的!!!因为使用new单独为每一维数组分配到内存空间,很可能是不连续的。
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
cout<<arr2[i][j]<<" ";
}
cout<<endl;
}
int arr3[7][9];
fill(arr3[0],arr3[0]+7*9,99);//静态的分配内存,保证了一次分配连续内存,可以直接这样写!!
for(int i =0;i<7;i++){
for(int j = 0;j<9;j++){
cout<<arr3[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
另外,二维数组使用fill(arr[0],arr[0]+n*m,0),vector使用fill(vec.begin(),vec.end(),0)
https://blog.csdn.net/liu100m/article/details/90731422
https://blog.csdn.net/soonfly/article/details/51131141