struct User {
string name;
}
User[] users;
function f() external {
User memory user = users[0]; // create a pointer
user.name = "example name" // can't change the value of struct User
}
this inside the function int[] public numbers
function Numbers()public{
numbers.push(5)
numbers.push(10)
int[] storage myArray=numbers
// numbers[0] will also be changed to 1
myArray[0]=1
//Imagine you have an NFT contract and store the user's purchased nfts in a state variable on top-level
// now inside a function maybe you need to delete one of the NFT's, since user sold it
// so you will be modifying that list, inside a function using "storage"
}
// state variables are placed in Storage
int[] public numbers
function Numbers() public{
numbers.push(5)
numbers.push(10)
// we are telling Solidity make numbers local variable using "memory"
// That reduces gas cost of your contract
int[] memory myArray=numbers
myArray[0]=1
// Now, this time maybe you want to user's NFT's where price is less than 100 $
// so you create an array stored in "memory" INSIDE the function
// You loop through user's Nft's and push the ones that price<100
// then return the memory variable
// so, after you return the memory variable, it will be deleted from the memory
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract StorageMemory2 {
uint[] public values;
function doSomething() public
{
values.push(5);
values.push(10);
uint[] newArray = values; // The error will show here
}
}
但如果你加上“记忆”这个词:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import 'hardhat/console.sol'; // to use console.log
contract StorageMemory2 {
uint[] public values;
function doSomething() public
{
values.push(5);
values.push(10);
console.log(values[0]); // it will log: 5
uint[] storage newArray = values; // 'newArray' references/points to 'values'
newArray[0] = 8888;
console.log(values[0]); // it will log: 8888
console.log(newArray[0]); // it will also log: 8888
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import 'hardhat/console.sol'; // to use console.log
contract StorageMemory2 {
uint[] public values;
function doSomething() public
{
values.push(5);
values.push(10);
console.log(values[0]); // it will log: 5
uint[] memory newArray = values; // 'newArray' is a separate copy of 'values'
newArray[0] = 8888;
console.log(values[0]); // it will log: 5
console.log(newArray[0]); // it will log: 8888
}
}
使用内存创建一个 收到变量,该变量不引用“ value”数组。
如果您感兴趣,可以使用‘ Calldata’将变量作为只读传递:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract CallDataExample {
uint[] public values;
function doSomething() public
{
values.push(5);
values.push(10);
modifyArray(values);
}
function modifyArray(uint[] calldata arrayToModify) pure private {
arrayToModify[0] = 8888; // you will get an error saying the array is read only
}
}