Solidity语言学习——(四)

深入了解solidity-数组和结构体 这一篇文章主要介绍solidity中的两个重要变量类型:数组(array)和结构体(struct)。 数组是一种数据结构,它是存储同类元素的有序集合。 数组中的特定元素由索引访问,索引值从0开始。例如,声明一个数组变量,如numbers,可以使用numbers[0]、numbers[1]和…,数字[99]表示单个变量。 数组(Array)是solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组主要有两种固定长度数组和可变长度数组。 要声明一个固定长度的数组,需要指定元素类 阅读详情

结构体

特点:结构体也是solidity中的自定义数据,它包含基本类型与复杂类型。

注:在solidity中结构体类型不能作为返回值来进行返回,只能是返回其指定属性。

案例:

pragma solidity ^0.4.18;


contract structdemo{
    
    struct Bank{
        address  addr;
        uint balance;
        Person p;
    }
    
    struct Person{
        string  name ;
        uint8  age;
        string sex;
    }
    
    Person p1 = Person({
        name : "wek",
        age : 18,
        sex : "nan"
    });
    
    Bank bank = Bank({
       addr : 0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B,
       balance : 999999999,
       p :p1 
    });
    
    function getbank()view returns(address,uint,string,uint8,string){
        return (bank.addr,bank.balance,bank.p.name,bank.p.age,bank.p.sex);
    }
    
    
    
}

 

 结果为:

 另一种定义方法为:

  function getbank()view returns(address,uint,string,uint8,string){
        return (bank.addr,bank.balance,bank.p.name,bank.p.age,bank.p.sex);
    }
    
    Person p2 = Person("wek1",200,"nan");
    function getperson()view returns(string,uint8,string){
        return (p2.name,p2.age,p2.sex);
        
    }

 

结果为:

 数组

数组分为定长与不定长(变长),注:对于storage数组来说,元素类型可以为任意类型,但是在memory数组中,元素的类型与函数的可见性有关,因此,如果函数是外部可见的,那么函数的参数就不能是映射类型的数组。

function Wai( mapping[5]){},这样的就是错误的。

声明方式:

定长:array[5]

不定长:array[] 可以通过关键字new进行初始化,uint []  array= new uint[](10);不过这种方式其实是分配内存,就是memory类型的数组,所以它不能通过.length来修改其数组的长度。

如果状态变量类型是一个public的数组,那么solidity会自动创建一个访问器,就可以通过下标直接访问这个变量。

数组的字面量:是指表达式的方式声明一个数组,并作为一个数组变量的使用方式,通过这种方式只能声明一个memory类型的数组,其元素类型正好是指能存储元素的长度。

案例:

 
        function g()view returns(uint8[3]){
            
            return f([1,2,3]);
        }
        function f(uint8[3] a)view returns(uint8[3]){
            return  a ;
        }

 结果为:

 

数组的属性和方法:

数组拥有.length属性,可以获取其长度。对于定长数组来说,数组的长度不可更改。变长数组可以更改,其更改长度长于原数组的话会用0补,若小于原数组,则剪去多余下标的元素。

而且变长数组拥有push方法,可以利用这个方法添加新元素到数组末尾,其返回值是新的数组长度。

 

案例:

 contract Array{
         uint8[5] a = [1,2,3,4,5];
        
        function getarray()view returns(uint8[5]){
            
            return a;
            
        }
        function Updata(uint8 index, uint8 value){
            a[index]=value;
            
        }
        
        
        
    }
    

 

结果为:

 

 数组也可以获取其长度。

 function getlength()view returns(uint){
            return a.length;
        }
        

 

 不定长数组操作:

   
    contract Barray{
        
        uint8 [] a= [1,2,3,4,5];
        function getlength()view returns(uint){
            return a.length;
        }
        function pushlast(uint8 value)view returns(uint8[]){
            a.push(value);
            return a;
        }
        function updata(uint8 index,uint8 value)view returns(uint8[]){
            a[index]=value;
            return a;
        }
        
    }

结果为:

 二维数组

数组元素一维数组一样,不一样的是二维数组的行列与其他大多数语言是相反的。

uint[3][5]  x ,这里的x代表的是5行3列的一个二维数组。

uint[][5] y 这里y的代表的是一个5行没有列的数组,但每一行都是一个数组。

映射

字典,键值对的映射关系存储结构mapping[keytype =>keyvalue];

映射本身,动态数组,合约,结构体,枚举都不能够作为映射类型的键值。但映射的值可以是任意类型。

在solidity中,映射的长度是没有的,也没有键集合,值集合这样的概念。

在solidity中,mapping并不支持遍历,但是可以自己写一个。在后面我会将写出来的代码呈上。

 

案例:

    contract map{
        
        mapping(address=>uint8) balances;
        function set(address addr, uint8 balance ){
            balances[addr]=balance;
        }
        function get(address addr)view returns(uint8){
            return balances[addr];
            
        }
//并没有真正的删除addr的map,而是将其还原成初始化状态。
          function del(address addr){
            delete balances[addr];
        }
        
    }

 结果为:                                                                      注:如果要查找的地址不存在则会返回0

类型转换

隐式转换:如果运算符两边支持要转换的类型,则编译器会自动转换。隐式转换时要注意防止数据丢失。任何无符号整数都可以转化为更大类型的值,比如说任何一个可以转换位uint160的类型都可以转换为address类型。

如果向高位转,没有达到的位值会自动进行补0。

显示转换:在不允许转换的条件下,但能确定转换后数据不会丢失,可以转换的条件下,进行强制转换。注意uint32高位转换位uint16时,会导致高位截断。

案例:

pragma solidity ^0.4.18;

contract YTrans {
    uint8 a = 1;
    uint16 b = 2;
    // 低位转高位
    function ltoh() view public returns(uint16) {
        b = a ;
        return b;
    }

    // 高位转低位
    // 报错,不允许
    // function htol() view public returns(uint8) {
    //     a = b;
    //     return b;
    // }

    // uint160->address
    // 高位补0
    uint160 d = 10000000000;
    address to;
    function utoa() view public returns(address) {
        to = d;
        return to;
    }

}

结果为: 

 

 

Solidity 介绍 智能合约(Smart contract )是一种旨在以信息化方式传播验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。简单地说,智能合约可以理解为一个自执行的协议。智能合约可以自动处理协议的履行、管理、以及支付。 阅读详情

相关推荐

用Remix部署Solidity合约

    Remix是一个用于开发和部署Solidity合约的线上IDE,该IDE含有各个版本的Solidity,当一个工程有多个Solidity版本时,就需要使用Remix来进行分开编译和部署。 1、安装相关的编译与部署插件 1.1)安装Solidity编译插件     点击Remix左侧页边栏里的两脚插头图标,进入Remix的搜索栏,输入solidity关键字,按[Active]依次激活如下插件     SOLIDITY COMPILER     SOLIDITY STATIC ANALYSYS    

sanqima的专栏 5724

Solidity: 引用类型, array, struct

支持通过构造结构体的形式定义新的类型。结构体中的元素可以是原始类型,也可以是引用类型;结构体可以作为数组或映射的元素。数组字面常数(Array Literals)是写作表达式形式的数组,用方括号包着来初始化array的一种方式,常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。操作符来创建,但是必须声明长度,并且声明后长度不能改变。可变长度数组(动态数组):在声明时不指定数组的长度。类型了,里面每一个元素的type都以第一个元素为准。固定长度数组:在声明时指定数组的长度。

目前专注区块链相关技术的学习与分享 1224

什么是Solidity?

Solidity 是一种用于编写智能合约的高级编程语言,主要用于以太坊区块链平台。它由以太坊基金会的 Gavin Wood 等人设计和开发,支持面向对象、面向协议和函数式编程范式。Solidity 的语法类似于 JavaScript 和 C++,但也有着自己独特的特征,如可变性、可见性和事件等。Solidity 编写的智能合约可以在以太坊虚拟机(EVM)上运行,实现分布式应用(DApps)的开发和部署。solidity是以太坊虚拟机EVM智能合约语言是链上项目必备技能,听说学会了可以帮助你挣钱+找对象!

weixin_74169116的博客 1765

Solidity极简入门 | 第五讲:引用类型, array, struct

数组 array数组(Array)是 Solidity 中常用的一种变量类型,用于存储一组数据。它可以存储各种类型的元素,如整数、字节、地址等等。Solidity 支持多种数组类型,包括固定长度数组(Fixed-size Arrays)和动态长度数组(Dynamic Arrays)。固定长度数组在声明时需要指定数组的长度,而动态长度数组可以在运行时动态地调整大小。固定长度数组:在声明时指定数组的长...

weixin_31351409的博客 563

solidity编程

简介简介Solidity是⼀种⽤于编写以太坊虚拟机(EVM)智能合约的编程语⾔。我认为掌握Solidity是参与链上项⽬的必备技能:区块链项⽬⼤部分是开源的,如果你能读懂代码,就可以规避很多亏钱项⽬。Solidity具有两个特点:1.基于对象:学会Solidity之后,可以助你在区块链领域找到好⼯作,挣钱找对象。2.⾼级:不会Solidity,在币圈会显得很low进去之后会有四个选项,选择第三个第⼀个程序文件后缀名为.sol第1。

[ 「今でもあなたは私の光。」❤️如今你依旧是我的光。 4074

Solidity教程:初学Solidity

这篇关于Solidity教程的博客展示了很多Solidity特性。本教程假定你对以太坊虚拟机和编程有一定的了解。 以太坊,“世界计算机”提供了一个非常强大的全球共享基础设施,使用名为Solidity的编程语言构建去中心化应用程序。 让我们开始我们的Solidity教程,介绍Solidity。 什么是Solidity? 以太坊Solidity是一种面向智能合约的高级语言,其语法与JavaScript...

mongo_node的专栏 3579

Solidity学习::(9)数组特性

数组 数组的定义 一、定长数组 要注意定长数组的长度与内容要匹配 uint[3] memory a = [uint(1), 2, 3];                                   //这是正确定义 uint[3] memory a = [1, 2, 3];                                   //这样也不行  stri...

dieju8330的博客 1175

solidity入门学习——mapping

今天我们来学习下映射的用法,具体以网站的注册过程为例。 一、solidity中,映射的关键字为mapping,首先我们先来定义两个mapping, mapping(address =>uint) idmapping和mapping(uint =>string) namemapping。idmapping用来表示地址变量和整型变量的对应关系,在注册过程中用来表示账户地址和注册号;namemapping用来表示整型变量和字符串的对应关系,在注册过程中用来表示注册号和用户名称。 同时将sum的初始值设成1,用来储存注册号,并在后续调用注册函数时累加。用户调用注册函数时,需要传入参数name,同时将合

Solidity 小白教程:6. 引用类型, array, struct

这一讲,我们介绍了 solidity 中数组(array)和结构体(struct)的基本用法。下一讲我们将介绍 solidity 中的哈希表——映射(mapping。

区块链、智能合约工具箱 953

2024年上半年网络工程师下午真题及答案解析

位于MPLS域边缘、连接其他网络的LSR称为( 3 ),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时,MPLS入口设备分析IP报文的内容并为其添加合适的标签,所有MPLS网络中的LSR根据标签转发数据,当该IP报文离开MPLS网络时,标签由出口LER弹出。LSP的出口LER称为( 6 )。某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。

bsefef的博客 2472

QComboBox设置最大显示数量多余的用滑动条,以及QComboBox::setMaxVisibleItems()不起作用的问题

QComoboBox是Qt封装的一个选择框的东西,但是我在使用过程中有一点感觉很不好,如图: 不论你往里面添加多少个它都会给你显示全部,甚至给你铺满全屏,后来看了官方文档发现有个setMaxVisibleItems()的方法,我欣喜若狂啊,终于特么的能解决了,但是,很遗憾,不知为啥,我设置上之后并没有起作用,依然会显示全部,后来搜了百度发现有个人是这样解决的 QComboBox *box = ne...

Aboveground的博客 4919

Solidity语言详解

Solidity语言学习学习总结 关于solidity语言我们从三个方面来学习,分别从 文件结构 数据类型 错误处理(独特) 我们在学习一门新语言的时候,通常从基础语法到函数,再到文件、结构体进行学习,最后深入到框架。以上三个点是solidity语言区别于其他语言的三个显著点,所以提出来着重讲。 这是solidity官方文档:https://learnblockchain.cn/docs/solidity/installing-solidity.html#remix 一、合约文件剖析 1.1一个合约文件

令狐_JackieHao的博客 3万+

STM32F407通过FSMC接口与LAN9252的EtherCAT从站移植实战

本文详细介绍了在STM32F407平台上,通过FSMC接口驱动LAN9252 EtherCAT从站控制器的完整移植实战。内容涵盖硬件连接、FSMC时序配置、官方SDK代码分析与关键修改、EtherCAT协议栈集成适配,以及实战调试与稳定性优化技巧,旨在帮助工程师解决工业通信中的核心挑战,实现稳定高效的实时控制网络接入。

weixin_29268267的博客 274

Solidity基础四

Solidity的结构体、Solidity的映射、Solidity的枚举、数组、结构体、映射的直接相互嵌套、关于枚举的嵌套

尽欢的博客 2721

运算放大器电路中的T型网络:如何用更小电阻实现高增益并降低噪声?

本文深入解析了运算放大器电路中T型反馈网络的设计与应用。该网络通过三个较小阻值电阻的组合,等效实现高增益,有效规避了传统大反馈电阻带来的显著热噪声问题。文章从数学原理、噪声定量分析到实际设计技巧,系统阐述了如何利用T型网络在实现高增益的同时,显著降低电路噪声并改善整体性能。

banana的博客 318

避开这些坑!baostock获取股票数据时最容易犯的5个错误(Python实战)

本文针对使用Python和baostock库获取股票历史数据时常见的五大陷阱,提供了实战解决方案。重点剖析了登录状态验证、参数配置、数据解析、批量操作效率及数据一致性校验等关键环节,帮助开发者构建稳健高效的数据获取流程,避免因细节疏忽导致的数据错误或性能瓶颈。

websocket5live的博客 1440

solidity教程:solidity语言入门

这篇关于Solidity教程的博客展示了很多Solidity特性。本教程假定你对以太坊虚拟机和编程有一定的了解。 以太坊,“世界计算机”提供了一个非常强大的全球共享基础设施,使用名为Solidity的编程语言构建去中心化应用程序。 让我们开始我们的Solidity教程,介绍Solidity。 什么是Solidity? 以太坊Solidity是一种面向智能合约的高级语言,其语法与JavaSc...

rejames的博客 2万+

RADIOML 2018.01A调制信号数据集介绍及处理

RadioML 2018.01A 由 DeepSig 发布,是专门针对自动调制识别(Automatic Modulation Recognition, AMR)和无线信号分类研究设计的基准数据集。它在原有 RadioML 2016.10a 的基础上,扩展并精细化了信道仿真模型,使得信号更接近真实无线环境下的表现。该数据集广泛用于机器学习模型的训练与评估,为各类深度学习算法提供了统一、可重复的实验条件。

weixin_56527269的博客 1887

VSCode集成prettier-plugin-solidity:打造高效Solidity开发环境

prettier-plugin-solidity是一款专为Solidity代码设计的Prettier插件,能够自动格式化Solidity代码,帮助开发者保持一致的代码风格,提升开发效率。本文将详细介绍如何在VSCode中集成prettier-plugin-solidity,打造高效的Solidity开发环境。 ## 准备工作:安装必要的VSCode扩展 在开始集成prettier-plugin

gitblog_00277的博客 882

CSP-J2019普及组复赛T4:加工零件

CSP-J2020普及组复赛T1:优秀的拆分,广度优先遍历求最短路。

少儿编程乔老师 1854

【Davinci开发】:MPU(内存保护)

【Davinci开发】:MPU(内存保护)

2207

prettier-plugin-solidity配置教程:自定义你的Solidity代码风格

prettier-plugin-solidity是一款专为Solidity代码设计的Prettier插件,能够帮助开发者自动格式化Solidity代码,保持代码风格的一致性。本教程将详细介绍如何配置prettier-plugin-solidity,让你轻松自定义Solidity代码风格。 ## 一、安装prettier-plugin-solidity 要使用prettier-plugin-so

gitblog_00342的博客 651

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Solidity - 介绍

章节Solidity – 介绍 Solidity – 环境搭建 Solidity – 基础语法 Solidity – 第一个程序 Solidity – 代码注释 Solidity – 数据类型 Solidity – 变量 Solidity – 变量作用域 Solidity – 运算符 Solidity – 算术运算符 Solidity – 比较运算符 Solidity – 逻辑运算符 ...

吴吃辣 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Solidity【简介】

Solidity概述、Solidity语言核心特性、Solidity开发工具Remix、智能合约学习游戏、什么是以太坊、以太坊虚拟机EVM

尽欢的博客 1714

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Solidity

编写智能合约绕不过去的一个坑就是要学一种新的编程语言,这就是号称智能合约编程语言的 Solidity本次学习的版本为0.8.0Solidity官方中文学习文档Solidity 中文文档 — Solidity中文文档 — 登链社区 (learnblockchain.cn)Solidity学习教程Solidity 教程 - 编程宝库 (codebaoku.com)目录一、Solidity概述二、Solidity语言核心特性三、Solidity开发工具Remix四、以太坊是什么五、以太坊虚拟机EVM。

qq_62397022的博客 910

Solidity 从入门到实战(四)

Solidity 从入门到实战(四) 注意:本专栏主要参考于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记以及https://blog.csdn.net/weixin_45067603/article/details/105751748 函数重载 函数重载是指函数命名相同,参数列表不同,即需要满足以下两个条件之一 1.函数传入参数类型不同 2.函数传入参数数量不同 pragma soli

qq_38716929的博客 1179
上一篇: Solidity语言学习——(三)
下一篇: Solidity语言学习——(五)
The_Reader
博客等级 码龄10年 74粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值