// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
//数组的类别,局部数组和内存数组
contract Arr {
//先定义一个局部数组,且是动态数组长度
uint[] public arrdongtai \= [1,2,3];
//定义一个定长数组 这里有个一个编程常识误区,
//uint【5】 代表的是数组长度为5个,不是索引,不是索引,不是索引
uint[5] public arrdingchang \= [1,2,3,4,5];
//定义一个对strong存储的数组修改函数
function editArrStrong() external {
//添加数据到数组,可以理解为追加
arrdongtai.push(99);//[1,2,3,99]
//获取数组长度
arrdongtai.length;
//删除数组内的数据,这里的数字就是索引了,需要注意的是,这里的删除并不是删除索引所对应的数据,而是设置为默认值了,也就是0
delete arrdongtai[3];
//取出单个数据
uint x \=arrdongtai[0];
//修改单个数据
arrdongtai[1] \= 666;
//移除索引
arrdongtai.pop();
}
//对数组进行操作的函数
//注意这里的内存数组长度不能修改,也就是所有修改长度的函数都无法对他使用
function editArrMemory() external returns (uint[] memory){
//定义一个内存数组,内存数组必须给予一个长度,方式有且只有这一种,关键词memory导致定义时只能在函数内,
//函数外默认是strong内存
uint[] memory arrjinmen \=new uint[](3);
}
}
现在,开始把每个操作封装成函数进行操作查看结果
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
contract Arr {
//把数组的操作方式都封装函数
uint[] public arrDynamic \= [1];
uint[3] public arrFixed \= [1,2,3];
//添加函数
function DynamicPush() external {
//添加动态数组
arrDynamic.push(5); //[1,5]
}
//根据索引修改
function DynamicIndex() external {
//修改数组的第2个元素为2
arrDynamic[2] \= 2; //[1,5,2]
}
//移除动态数组的最后一个
function DynamicPop() external {
arrDynamic.pop();//[1,5]
}
//取去动态数组其中一个值
function DynamicVue() external view returns (uint){
uint a \= arrDynamic[0];
return a;
}
//删除动态数组中一个值
function DynamicDelet() external {
delete arrDynamic[0];//[0,5]
}
//获取长度
function DynamicLength() external view returns (uint) {
uint b \= arrDynamic.length;
return b;
}
/************定长数组********************/
//获取定长数组长度
function FixedLength() external view {
arrFixed.length;
}
//修改定长数组特定索引
function FixedIndex() external {
//修改数组的第2个元素为2
arrFixed[2] \= 2; //[1,2,2]
}
//删除定长数组特定索引
function FixedDelet() external {
delete arrFixed[0]; //[0,2,2]
}
//取出定长数组特定索引的值
function FixedVue() external view {
arrFixed[1];
}
/*****************内存数组的操作***********************/
function memoryArrVue() external pure returns (uint,uint[] memory,uint[3] memory){
//定义一个局部内存数组
//假如我在初始化的时候就想赋值一个初始值应该怎么做?
/**********内存数组初始化时赋值*************/
uint[3] memory nftArr \= [uint(1), 2, 3];
uint[] memory memoryArray \=new uint[](4);//[0,0,0,0]
memoryArray[0] \= 1;//[1,0,0,0]
//取值
//删除
delete nftArr[1];//[1,0,3]
return (memoryArray[0],memoryArray,nftArr);
}
function memoryArrStart() external pure returns (uint[] memory){
uint[] memory memoryArray \= new uint[](4);
return memoryArray;
}
}
如图所示,在memory内存变量中有许多关键点,需要细品