C++数组初始化memset和fill

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;
}
  1. 静态数组使用memset(arr,0,sizeof(arr)),可以把数组元素都设置为0。
  2. 也可以memset(arr,-1,sizeof(arr)),设置为-1,其他数则不行。二维数组也可使用memset(arr,0//-1,sizeof(arr));设置
  3. 使用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;
}
  1. int* arr = new int[10]();可以设置数组元素为0。注意:括号内啥都不能有,否则报错!!!
  2. 使用memset(arr,0,sizeof(arr))不能将所有数组元素设置为0,原因是arr是一个指针,而指针的长度只能是8个字节(64位系统),最终结果只能保证使用memset设置前两个元素为0或-1。
  3. 使用memset(arr,0//-1,10*sizeof(int))可以设置0或-1。二维数组使用memset(arr,0,sizeof(arr));
  4. 使用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

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值