4. Solidity:引用类型变量:数组

4.1 数组分类

  • 动态数组(可变长度数组)
    // 动态数组
    uint[] public nums = [1,2,3];
    bytes public bs;
    address[] public addrs;
  • 定长数组
    // 定长数组
    uint[3] public nums3 = [1,2,3];
    bytes[3] public bs4;
    address[3] public addrs3;

4.2 数组操作

  • length: 获取数组长度
  • push() & push(x): 数组长度+1,push() 为添加元素默认值,push(x)为添加指定元素值
  • delete: 数组长度不变,索引对应元素置为默认值
  • pop(): 数组元素-1,删除末尾元素
    代码示例:
    // 数组操作 
    function arrayOp() external returns (uint,uint,uint[] memory){
        // 获取数组长度
        uint a = nums.length;
        uint b = nums3.length;
 
        // push() & push(x)
        nums.push(); // 数组长度增加1,push元素为uint默认值:[1,2,3] -> [1,2,3,0]
        nums.push(5); // [1,2,3,0,5]

        // delete
        delete nums[1]; // [1,0,3,0,5]

        // pop()
        nums.pop(); // [1,0,3,0]
        return (a,b,nums);
    }

4.3 内存中的数组

  • 内存中创建数组使用new关键字
  • 必须指定数组长度(内存中创建的数组为定长数组)
    示例代码:
    // 内存中的数组
    function arrInMemory() pure external returns (uint, uint[] memory) {
        // 在内存中创建数组,使用new关键字,数组必须指定长度。(内存中的数组必须为定长数组)
        uint[] memory a = new uint[](3);

        // 内存中数组的相关操作
        // 获取数组长度
        uint l = a.length;
        // 赋值
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
        // "删除元素"
        delete a[1];

        return (l,a);
    }

4.4 数组元素删除

Solidity中delete方法只会将数组中的元素置为默认值,并不会将数组中的元素从数组中移出,即不会改变数组长度。如果想删除数组中的指定元素,根据业务需求不同,可以有移动数组元素和替换数组元素两种方法。

  • 移动数组元素:适用于对数组元素顺序有要求的情况(不改变数组元素顺序,但是消耗较多gas fee)
    // 删除数组元素--移动数组元素
    function remove1(uint _index) external returns (uint[] memory) {
        require(_index < nums.length, "index out if range");
        for (uint i = _index;i < nums.length - 1;i++) {
            nums[i] = nums[i+1];
        }
        nums.pop();
        return nums;
    }
  • 替换数组元素:适用于对于数组元素顺序没有要求的情况(消耗较少gas fee,但是改变了数组元素顺序)
    // 删除数组元素--替换数组元素
    function remove2(uint _index) external returns (uint[] memory){
        require(_index < nums.length, "index out if range");
        nums[_index] = nums[nums.length - 1];
        nums.pop();
        return nums;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容