solidity中,有两种数组:存储数组和内存数组
存储数组(Storage arrays)
这些数组被声明为状态变量,并且可以具有固定长度和动态长度。动态储存数组可以调整数组的大小,它们通过访问push()和pop()方法来调节长度。
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.17;
contract A {
uint256[] public numbers; // 动态长度数组
address[10] private users; // 固定长度数组
uint8 users_count;
/**
* 添加用户
*/
function addUser(address _user) external {
require(users_count < 10, "number of users is limited to 10");
users[users_count] = _user;
users_count++;
}
function addNumber(uint256 _number) external {
numbers.push(_number);
}
}
内存数组(memory arrays)
数组以memory作为其数据位置声明。可以具有固定长度或动态长度,但是不能调整大小(不能调用push和pop方法),数组的大小必须预先计算
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.14;
contract B{
function createMemArrays() external view {
uint256[20] memory numbers;
numbers[0] = 1;//你不会收到任何警告,但最终将得到无效的操作码,因为根据内存中布局的描述,array将指向零插槽,因此切勿写入。请记住,在使用数组之前,请务必先对其进行初始化,以便获取有效的地址
numbers[1] = 2;
uint256 users_num = numbers.length;
// address[users_num] memory users1;
address[] memory users2 = new address[](users_num);
users2[0] = msg.sender;
// users2.push(msg.sender);//Member "push" is not available in address[] memory outside of storage
}
}