千家信息网

Solidit数组有什么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"Solidit数组有什么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Solidit数组有什么用"吧!数组(Arrays)数组可
千家信息网最后更新 2026年11月01日Solidit数组有什么用

这篇文章主要讲解了"Solidit数组有什么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Solidit数组有什么用"吧!

数组(Arrays)

数组可以声明时指定长度,也可以是动态变长。对storage存储的数组来说,元素类型可以是任意的,类型可以是数组,映射类型,结构体等。但对于memory的数组来说。如果作为public函数的参数,它不能是映射类型的数组,只能是支持ABI的类型。

一个元素类型为T,固定长度为k的数组,可以声明为T[k],而一个动态大小(变长)的数组则声明为T[]。 还可以声明一个多维数组,如声明一个类型为uint的数组长度为5的变长数组(5个元素都是变长数组),可以声明为uint[][5]。(注意,相比非区块链语言,多维数组的长度声明是反的。)

要访问第三个动态数组的第二个元素,使用x[2][1]。数组的序号是从0开始的,序号顺序与定义相反。

bytes和string是一种特殊的数组。bytes类似byte[],但在外部函数作为参数调用中,bytes会进行压缩打包。string类似bytes,但不提供长度和按序号的访问方式(目前)。 所以应该尽量使用bytes而不是byte[]。

可以将字符串s通过bytes(s)转为一个bytes,可以通过bytes(s).length获取长度,bytes(s)[n]获取对应的UTF-8编码。通过下标访问获取到的不是对应字符,而是UTF-8编码,比如中文编码是多字节,变长的,所以下标访问到的只是其中的一个编码。 类型为数组的状态变量,可以标记为public,从而让Solidity创建一个访问器,如果要访问数组的某个元素,指定数字下标就好了。(稍后代码事例)

创建内存数组

可使用new关键字创建一个memory的数组。与stroage数组不同的是,你不能通过.length的长度来修改数组大小属性。我们来看看下面的例子:

pragma solidity ^0.4.16;contract C {    function f(uint len) public pure {        uint[] memory a = new uint[](7);                        //a.length = 100;  // 错误        bytes memory b = new bytes(len);        // Here we have a.length == 7 and b.length == len        a[6] = 8;    }}

数组常量及内联数组

数组常量,是一个数组表达式(还没有赋值到变量)。下面是一个简单的例子:

pragma solidity ^0.4.16;contract C {    function f() public pure {        g([uint(1), 2, 3]);    }    function g(uint[3] _data) public pure {        // ...    }}

通过数组常量,创建的数组是memory的,同时还是定长的。元素类型则是使用刚好能存储的元素的能用类型,比如[1, 2, 3],只需要uint8即可存储,它的类型是uint8[3] memory。

由于g()方法的参数需要的是uint(默认的uint表示的其实是uint256),所以需要对第一个元素进行类型转换,使用uint(1)来进行这个转换。

还需注意的一点是,定长数组,不能与变长数组相互赋值,我们来看下面的代码:

//  无法编译pragma solidity ^0.4.0;contract C {    function f() public {        // The next line creates a type error because uint[3] memory        // cannot be converted to uint[] memory.        uint[] x = [uint(1), 3, 4];    }}

已经计划在未来移除这样的限制。当前因为ABI传递数组还有些问题。

成员

length属性

数组有一个.length属性,表示当前的数组长度。storage的变长数组,可以通过给.length赋值调整数组长度。memory的变长数组不支持。 不能通过访问超出当前数组的长度的方式,来自动实现改变数组长度。memory数组虽然可以通过参数,灵活指定大小,但一旦创建,大小不可调整。

push方法

storage的变长数组和bytes都有一个push方法(string没有),用于附加新元素到数据末端,返回值为新的长度。

限制情况

当前在external函数中,不能使用多维数组。

另外,基于EVM的限制,不能通过外部函数返回动态的内容。

contract C {     function f() returns (uint[]) { ... }      }

在这个的例子中,如果通过web.js调用能返回数据,但从Solidity中调用不能返回数据。一种绕过这个问题的办法是使用一个非常大的静态数组。

pragma solidity ^0.4.16;contract ArrayContract {    uint[2**20] m_aLotOfIntegers;    // 这里不是两个动态数组的数组,而是一个动态数组里,每个元素是长度为二的数组。    bool[2][] m_pairsOfFlags;    // newPairs 存在 memory里,因为是函数参数    function setAllFlagPairs(bool[2][] newPairs) public {        m_pairsOfFlags = newPairs;    }    function setFlagPair(uint index, bool flagA, bool flagB) public {        // 访问不存在的index会抛出异常        m_pairsOfFlags[index][0] = flagA;        m_pairsOfFlags[index][1] = flagB;    }    function changeFlagArraySize(uint newSize) public {        // 如果新size更小, 移除的元素会被销毁        m_pairsOfFlags.length = newSize;    }    function clear() public {        // 销毁        delete m_pairsOfFlags;        delete m_aLotOfIntegers;        // 同销毁一样的效果        m_pairsOfFlags.length = 0;    }    bytes m_byteData;    function byteArrays(bytes data) public {        // byte arrays ("bytes") are different as they are stored without padding,        // but can be treated identical to "uint8[]"        m_byteData = data;        m_byteData.length += 7;        m_byteData[3] = byte(8);        delete m_byteData[2];    }    function addFlag(bool[2] flag) public returns (uint) {        return m_pairsOfFlags.push(flag);    }    function createMemoryArray(uint size) public pure returns (bytes) {        // Dynamic memory arrays are created using `new`:        uint[2][] memory arrayOfPairs = new uint[2][](size);        // Create a dynamic byte array:        bytes memory b = new bytes(200);        for (uint i = 0; i < b.length; i++)            b[i] = byte(i);        return b;    }}

感谢各位的阅读,以上就是"Solidit数组有什么用"的内容了,经过本文的学习后,相信大家对Solidit数组有什么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

数组 长度 类型 元素 动态 函数 参数 大小 编码 下标 例子 内容 可以通过 属性 常量 序号 数据 方法 问题 多维 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司排名 南京欣网互联网络科技有限公司 互联网科技产业 互联网科技会 互联网中国科技 互联网科技的发展 互联网金融公司科技 上海喔噻互联网科技 碳银互联网科技有限公司 互联网科技有限公司 翻译 互联网科技创新企业排名 互联网科技公司招聘 科技与互联网的利与弊 互联网教育科技公司vipkid 重庆互联网医院沙龙医盟信息科技 速维有品互联网信息科技(苏州)有限公司 广州市恰铎互联网科技有限公司 高科技互联网套路 35岁以上互联网科技行业 广州梦谷互联网科技有限公司领导 互联网科技活动banner 涨乐互联网科技 安控科技rtu产品工业互联网 贵州叶脉互联网科技有限公司所属行业 郑州欣桑互联网科技有限公司 信承诺互联网科技有限公司 万物互联网智能科技 北京互联网科技类企业分布 承德科技产业互联网平台 互联网科技自媒体灵感
0