复合类型的数据包括:array(数组)、struct(结构体)和mapping(映射),其中array和struct也称为引用类型。

复合类型

数组(array)

数组(array)是一种用于存储相同类型元素的集合,分为固定长度的静态数组和长度可变的动态数组。需要注意的是,数组中的元素类型不能是映射类型(mapping),因为映射类型本身就是一种复杂的数据结构,无法直接存储在数组中。

    uint[5] array1;     //声明了一个长度为5的静态数组,用于存储无符号整数类型的数据
uint[] array2; //声明了一个动态数组,它可以更具需要在运行是调整大小

赋值:

为静态数组赋值可以直接赋值也可以逐个赋值:

直接赋值:在合约的构造函数中,直接使用静态数组的初始化列表来初始化数组元素。

逐个赋值:使用索引运算符'[]',给静态数组的不同位置赋值。

    uint[3] public Array;       //声明一个长度为3的静态数组Array

//直接赋值
constructor(){
Array = [1, 2, 3]; //在构造函数中直接初始化数组
}

//逐个赋值
function assign(uint value1, uint value2, uint value3) public{
Array[0] = value1;
Array[1] = value2;
Array[2] = value3; //逐个给数组的每个位置赋值
}

为动态数组赋值的方式也有多种:

使用'.push()'方法逐个赋值:使用'.push()'方法将元素逐个添加进数组的末尾。

整体赋值:将一整个数组直接赋值给目标数组。

索引赋值:使用索引运算符'[]'来为索引的元素赋值。

    uint[] public Array;        //声明一个动态数组

//'.push()'方法赋值
function add(uint value) public{
Array.push(value); //使用',push()'方法在数组末尾添加元素
}

//整体赋值
function addArray(uint[] memory values) public{
Array = values; //将整个数组赋值给目标数组
}
//索引赋值
function assign(uint index, uint _value) public{
Array[index] = _value; //对数组的某个位置赋值
}

数组方法:

'.push()'方法:'.push(_value)'用于在动态数组的末尾添加一个元素,'.push()'可在动态数组末尾添加'0'元素。

'.pop()'方法:'.pop()'用于删除动态数组的末尾元素。

'.length'方法:'.length'方法用于返回数组的当前长度。

其中'.push()'方法和'.pop()'方法只能用于动态数组。

特殊:bytes也是数组,是一种动态长度的字节数组,类似于动态数组,可以存储任意长度的字节数据,使用时不用加索引符'[]'。

    bytes public Bytes;         //声明一个'bytes'类型的变量

function setBytes(bytes memory data) public{
Bytes = data; //通过'setBytes'函数为'Bytes'赋值
}

结构体(struct)

solidity中的结构体(struct)类似于C/C++中的结构体,允许将多个不同数据类型的成员组合在一起以表示一个实体。

    //定义一个名为Student的结构体
struct Student{
string stuName; //字符串成员,表示学生姓名
uint stuId; //无符号整型成员,表示学生学号
}

Student public student; //声明一个Student类型的变量

赋值:

为结构体成员赋值同样有多种方式:

直接赋值:直接为结构体成员进行赋值。

构造函数赋值:如果结构体包含在合约中,可以用构造函数对结构体进行赋值。

传参赋值:将结构体作为函数参数传递,在函数内进行赋值。

    //用上述Student结构体进行示例

//直接赋值
Student memory student1;
student1.stuName = "Tom";
student1.stuId = 111111;

Student memory student2 = Student("Jack", 222222);//也可按结构体成员一次赋值

//构造函数赋值
constructor(string memory name, uint id){
student = Student(name, id);
}

//传参赋值
function setStudent(string memory name, uint id) public{
student = Student(name, id);
}

Solidity-变量和数据类型[复合类型_1]的更多相关文章

  1. [Go] 复合类型(数组、切片、字典、结构体)变量的 初始化 及 注意事项

    Go变量 初始化 对 复合类型(数组.切片.字典.结构体)变量的初始化是,有一些语法限制: 1.初始化表达式必须包含类型标签: 2.左花括号必须在类型尾部,不能另起一行: 3.多个成员初始值以逗号分隔 ...

  2. 深入理解PHP内核(五)变量及数据类型-变量的结构和类型

    原文链接:http://www.orlion.ga/238/ 编程语言的类型可以分为强类型和弱类型两种,PHP是弱类型语言,但是C语言是强类型语言.在官网PHP实现内部,所有变量使用同一种数据结构(z ...

  3. PHP 注释 数据类型 变量的定义/输出 类型的获取/转换 可变变量

    注释方法: 1,单行注释:     // 2,  多行注释:     /*   */ 二,数据类型 1,integer(整数型):在三十二位操作系统中它的有效范围是:-2147483648~+2147 ...

  4. 变量和基本类型——复合类型,const限定符,处理类型

    一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...

  5. ECMAScript1.1 js书写位置 | 声明变量 | 基本数据类型 | 数据类型转换 | 操作符 | 布尔类型的隐式转换

    js书写位置 由于在写css样式时使用的时双引号,所以我们在写js代码时建议使用单引号(‘’)! 行内式 <input type="button" value="点 ...

  6. 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...

  7. PHP变量和数据类型

    编程语言可以分为三大类 1. 静态类型语言,比如:C/Java等,在静态语言类型中,类型的检查是在编译期(compile-time)确定的. 2. 动态语言类型,比如:PHP,python等各种脚本语 ...

  8. 学习C++.Primer.Plus 4 复合类型

    本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...

  9. Python变量、数据类型6

    1.Python变量 变量,即代表某个value的名字. 变量的值存储在内存中,这意味着在创建变量时会在内存中开辟一个空间. !!!即值并没有保存在变量中,它们保存在计算机内存的深处,被变量引用.所以 ...

  10. c++学习总结--复合类型,const。

    复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复 ...

随机推荐

  1. flutter填坑之旅(widget原理篇)

    Flutter 的跨平台思路快速让他成为"新贵",连跨平台界的老大哥 "JS" 语言都"视而不见",大胆的选择 Dart 也让 Flutte ...

  2. 智慧饮水系统_Android客户端

    智慧饮水系统(又名:水牛 APP) 1.介绍 该项目基于 Rfid-RC522.ESP-32 进行下位机开发,硬件模块 Rfid-RC522 主要读取用户的卡号,ESP32 单片机通过 WiFi 模块 ...

  3. Java的先行发生原则

    先行发生原则(Happens-Before)是Java内存模型定义的一个等效判断原则.依赖这个原则,我们可以通过几条简单规则判断数据是否存在竞争,线程是否安全,而不需要陷入Java内存模型苦涩难懂的定 ...

  4. k8s实战案例之部署redis单机和redis cluster

    1.在k8s上部署redis单机 1.1.redis简介 redis是一款基于BSD协议,开源的非关系型数据库(nosql数据库),作者是意大利开发者Salvatore Sanfilippo在2009 ...

  5. ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销

    认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作--登录和注销.ASP.NET Core利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用 ...

  6. global average pooling

    首先需要对深度网络中常见的pooling方式,以及全连接层有大致的了解.(此处略过不提.) paper: Network in Network fully connected layer 的缺点 在N ...

  7. 前台vue发送json格式,后台srpeingboot不能自动处理解决办法

    使用HashMap解决,如下图

  8. 加速体细胞突变检测分析流程-系列2(ctDNA等高深度样本)

    Sentieon●体细胞变异检测系列-2 Sentieon 致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率.准确度和可靠性. 针对 ...

  9. .net core提示502.5错误

    最近给WindowsServer2012服务器部署.Net Core项目,部署后一直显示502.5错误,具体如下: 网上找了一大堆解决办法都行不通,最后在stackoverflow中找到说是缺少一个补 ...

  10. java端口被占用解决办法