solidity基础 -- 数组的使用

前提提要

如需本文章中任何源代码欢迎访问博主GitHub

solidity语言库   点击左边即可访问 获取源代码不求人 ~

Solidity 中数组的使用规则

在 Solidity 中,数组是一种基本的数据结构,用于存储多个元素。数组可以是固定大小的(uint[]),也可以是动态大小的(uint[] memoryuint[] storage)。以下是一些在 Solidity 中使用数组时需要遵守的规则和最佳实践:

1. 声明数组

在 Solidity 中声明数组,可以使用以下语法:

uint[] public myArray; // 动态大小数组
uint[10] public myFixedArray; // 固定大小数组,长度为10

2. 初始化数组

对于动态大小的数组,可以使用 new 关键字进行初始化:

uint[] memory myArray = new uint[](10); // 初始化一个长度为10的动态数组

对于固定大小的数组,不需要显式初始化。

3. 访问数组元素

访问数组元素时,使用方括号 []

uint firstElement = myArray[0]; // 访问第一个元素

4. 修改数组元素

可以直接赋值来修改数组元素:

myArray[0] = 100; // 将第一个元素设置为100

5. 动态数组的长度

对于动态数组,可以使用 .length 属性来获取数组的长度:

uint arrayLength = myArray.length; // 获取数组长度

6. 动态数组的内存管理

当在函数中使用动态数组时,需要指定数组是在内存(memory)还是在存储(storage):

  • memory:数组只在函数调用期间存在,不占用区块链存储。
  • storage:数组存储在区块链上,占用存储空间。
function pushElement(uint[] storage arr, uint value) public {
    arr.push(value); // 将值添加到存储数组
}

function getArray(uint[] memory arr) public pure returns (uint[] memory) {
    return arr; // 从函数返回内存数组
}

7. 复制数组

复制数组时,需要使用 copy 函数或者手动复制每个元素:

uint[] memory newArr = copyArray(myArray); // 使用自定义的 copy 函数复制数组

function copyArray(uint[] memory original) internal pure returns (uint[] memory) {
    uint[] memory copy = new uint[](original.length);
    for (uint i = 0; i < original.length; i++) {
        copy[i] = original[i];
    }
    return copy;
}

8. 避免常见错误

  • 不要使用 .length 作为数组索引,这会导致编译错误。
  • 确保在使用数组之前已经正确初始化。
  • 注意动态数组和固定数组的性能差异,特别是在循环中。

9.总体举例 

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

//数组:动态数组,固定长度的定向数组

//包括插入,修改,删除,弹出,通过函数来返回数组

contract Array {

    uint[] public nums = [1,2,3]; //定义动态数组,设置了初始值

    uint[3] public numsFixed = [4,5,6];  // 定义定向数组,设置了初始值,3是它的数组长度,

   

    function examples() external {

        nums.push(4); //动态数组可以通过push的方法推入数据,这里在尾部推入了4,定长数组不可以采用push

        uint x = nums[1];

//通过索引访问数组的值,数字代表索引位置,从0开始,uint1会索引成数字2

       

        nums[2] = 777;

//通过索引把第二个值修改为了777,把数组的元素修改

        delete nums[1];

//删除索引,删除并不会修改了数组的长度,所以他会把索引为1的值修改为默认值,默认为0

       

        nums.pop();

//采用pop会弹出数组中最后一个值,弹出之后数组会变短,最后一个元素4会被弹出

       

        uint len = nums.length;

//采用len可以获取到数组的长度

        uint[] memory a = new uint[] (5);

//在内存中创建数组,写上一个uint,新的数组还要定义长度

//在内存中不能使用pop或者push,只能够通过索引进行修改值

//内存中局部变量只能够定义定长数组,而动态数组只能够存在于状态变量中

        a[1] = 123;

    }

   

    function returnArray() external view returns (uint[] memory) {

        return nums;

    }

//把数组中所有元素返回

}

结论

在 Solidity 中使用数组时,了解其声明、初始化、访问和修改的规则是非常重要的。遵循这些规则可以帮助你编写更安全、更高效的智能合约代码。始终记得考虑存储和内存管理,以及如何有效地处理数组,以确保合约的可扩展性和性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值