IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 通学智能合约系列(二十)--结构体<下> -> 正文阅读

[区块链]通学智能合约系列(二十)--结构体<下>

大家好,通学技术,学通技术,让我们一起继续来看看智能合约结构体memorystorage类型转换吧~

6、结构体storage转storage详解

hello,大家好,我们紧接着上节内容来看看,结构体关于storagememory类型的转换。

我们先来看一个例子:

pragma solidity ^0.4.16;


contract StructTest{
    
    struct Student{
        string name;
        string grade;
    }
    
    Student student;
    
    function getStudent(Student storage stu) internal returns(Student){
        Student storage stu1 = stu;
        
        stu1.name = "tong xue ji shu ";
        
        stu1.grade = "social people";
        
        return stu1;
        
    }
    
    function test() view returns(string) {
         
         return getStudent(student).name;
    }
 }

编译执行后,我们得到了tong xue ji shu,我们知道了对合约中作为全局变量的结构体默认类型是storage的。我们的getStudent方法形参也是storage的,通过调用我们的test方法,将全局变量student以引用的方式传递给了我们的形式参数stu,最终修改了我们的全局变量的值。说起来还是挺简单的。

7、结构体memory转storage详解

那么如果,我们将memory赋值给storage呢?

pragma solidity ^0.4.16;


contract StructTest{
    
    struct Student{
        string name;
        string grade;
    }
    
    Student student;
    
    function getStudent(Student memory stu) internal returns(Student){
        student = stu;
        
        stu.name = "tong xue ji shu ";
        
        stu.grade = "social people";
        
        return stu;
        
    }
    
    function test() view returns(string) {
        
        Student memory tmp = Student("xiao wang","gao 2");
        
        getStudent(tmp);
         
        return student.name;
    }
 }

大家可以先思考下,上面这个test函数的执行结果是什么呢?以上的代码执行逻辑可以简要概括如下:

  1. 我们初始化了一个Student类型的tmp结构体
  2. 然后我们调用getStudent函数,将tmp拷贝了一份副本赋值给了stu
  3. 然后我们再将stu赋值给了student
  4. 最后,我们输出student.name,结果自然是展示 xiao wang;

我们在来看一个例子:

pragma solidity ^0.4.16;


contract StructTest{
    
    struct Student{
        string name;
        string grade;
    }
    
    Student student;
    
    function getStudent(Student memory stu) internal returns(Student){
        
        stu.name = "tong xue ji shu ";
        
        stu.grade = "social people";
        
        student = stu;
        
        return stu;
        
    }
    
    function test() view returns(string) {
        
        Student memory tmp = Student("xiao wang","gao 3");
        
        getStudent(tmp);
         
        return student.name;
    }
 }

这段代码仅仅是将getStudent函数中关于stu结构体的赋值的顺序做了调整。那么他的答案又是什么呢?

我们依然是来分析一下他的执行逻辑:

  1. 我们初始化了一个Student类型的tmp结构体
  2. 然后我们调用getStudent函数,将tmp拷贝了一份副本赋值给了stu
  3. 我们对stu对象重新赋值了tong xue ji shu.
  4. 然后我们再将stu赋值给了student
  5. 最后,我们输出student.name,结果自然是展示 tong xue ji shu;

代码执行的顺序,很重要,在写智能合约的时候,大家一定要注意哦。

8、结构体storage转memory详解

如果将storage传给memory又会发生什么呢?

pragma solidity ^0.4.16;


contract StructTest{
    
    struct Student{
        string name;
        string grade;
    }
    
    Student student = Student("xiao wang","gao 3");
    
    function getStudent(Student storage stu) internal returns(Student){
        
        Student memory tudent = stu;
        
        tudent.name = "tong xue ji shu ";
        
        tudent.grade = "social people";
        
        
        return tudent;
        
    }
    
    function test() view returns(string) {
    
        getStudent(student);
         
        return student.name;
    }
 }

我们依然是来分析一下他的执行逻辑:

  1. 我们初始化了一个Student类型的student结构体

  2. 然后我们调用getStudent函数,将student引用指向了stu

  3. 然后我们将stu又赋值给了内存中的student

  4. 接着我们对student对象重新赋值了tong xue ji shu.

  5. 最后,我们输出student.name,结果显示了xiao wang;

    这个说明,我们的内存中的修改,依然是不会影响区块链上的内容的。

9、结构体memory转memory详解

hello,大家好,我们最后来看看 memorymemory

pragma solidity ^0.4.16;


contract StructTest{
    
    struct Student{
        string name;
        string grade;
    }

    
    function getStudent(Student memory stu) internal returns(Student){
        
        Student memory tongtong = stu;
        
        tongtong.name = "tong xue ji shu ";
        
        tongtong.grade = "social people";
        
        
        return tongtong;
        
    }
    
    function test() view returns(string) {
        Student memory meimei = Student("meimei","3");
        
        getStudent(meimei);
         
        return meimei.name;
    }
 }

编译执行后,你会发现,答案竟然是tong xue ji shu.难道是想让你们点赞、在看、分享?

那肯定不是滴,这是因为solidity中为我们做了优化,memory实参转给memory形参是指针指向,所以最终结果

好了 ,到这一部分,我们关于智能合约 语言solidty的语法就介绍基本介绍完了,留下最后的枚举我们下节说,另外 我们在好好回顾总结下。这里的结束其实仅仅使我们真正要买入区块链技术的开始。让我们一起打起精神来,进行 更有意思的学习吧~

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:35:35  更:2021-07-10 14:36:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:35:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码