先看一段代码:
<!---->void main(){
int[] c = [1,2,3];
foreach(inout int i; c){
writef(&i);
writef(", ");
}
writefln("");
c.length = 2;
foreach(inout int i; c){
writef(&i);
writef(", ");
}
writefln("");
c.length = 3;
foreach(inout int i; c){
writef(&i);
writef(", ");
}
writefln("");
c.length = 4;
foreach(inout int i; c){
writef(&i);
writef(", ");
}
writefln("");
}
它输出结果如下:
B7D19FB0, B7D19FB4, B7D19FB8,
B7D19FB0, B7D19FB4,
B7D19FB0, B7D19FB4, B7D19FB8,
B7D1CFA0, B7D1CFA4, B7D1CFA8, B7D1CFAC,
可以看到前3行地址相同,后面一行地址不同。为什么?
D语言的数组分配是内存紧凑的,当减小数组长度减小时,只需要修改切片大小而不需要重新分配。当长度变大时,也会检查原来的缓冲区是否够大,以确定是否需要重新分配空间。注意第2次操作时把长度恢复为原来大小时,并非真的恢复了原来的状态,后面长出来的元素会被初始化为默认值。
再来看一个:
<!---->void main(){
int[] c = [1,2,3];
int[] d = c;
foreach(inout int i; c){
writef(&i);
writef(", ");
}
writefln("");
foreach(inout int i; d){
writef(&i);
writef(", ");
}
writefln("");
d.length = 2;
foreach(inout int i; c){
writef(&i);
writef(", ");
}
writefln("");
foreach(inout int i; d){
writef(&i);
writef(", ");
}
writefln("");
d.length = 4;
foreach(inout int i; c){
writef(&i);
writef(", ");
}
writefln("");
foreach(inout int i; d){
writef(&i);
writef(", ");
}
writefln("");
}
在执行int[] d = c;以后,d的确是和c共享了存储区。不过在改变d的长度以后,它就和c分道扬镳了。所以int[] d = c不能理解为d是一个指向c的引用,它实际上创建了一个新的数组对象,但并不拷贝数组元素,它和int[] d = c[0 .. length]是等价的,都是数组切片操作。
这个问题让我困惑不已。比如你用char[]表示一个单词,用char[][]表示一行,char[][][]表示多行。如何引用这个单词?你当然可以每次使用lines[i][j],但如果处理步骤很多,这会不会看起来很头大?
看上去应该这样使用:
<!---->char[][][] lines;
char[][] line = lines[0];
line.length = line.length + 1;
line[length - 1] = ",";
可惜根据前面的结论,这将无法影响到lines。如果找不到一个引用类型指向数组,有时候使用起来还真是很麻烦。看起来把Line/Word包装成类是个勉强凑合的主意。。。
相关推荐
D语言是一种现代化、高效且可移植的编程语言,由沃德·坎宁安(Walter Bright)设计。它结合了C/C++的性能与现代语言的特性,旨在提供一种更安全、更快速、更易于编写和维护的编程环境。D语言中文文档是针对中国...
从给定的文件标题“C语言数组结构实例”和描述中,我们可以提炼出关于C语言中数组处理的关键知识点。以下是对这些知识点的详细解析: ### C语言中的数组 #### 动态数组 在C语言中,标准数组是在编译时就确定了大小...
【CCC语言数组详细讲解】 数组在编程中是一种基础且重要的数据结构,特别是在C语言中,它扮演着不可或缺的角色。C语言中的数组属于构造数据类型,它由相同类型的多个变量按有序的形式组织。数组元素可以是基本数据...
同时,D语言的数组索引越界检查也是其安全性的一大亮点,能有效防止许多常见的运行时错误。 在性能上,D语言并不逊色于C++。由于可以直接生成机器码,D语言的程序执行速度快,而且它的模板元编程和内联函数等功能,...
### Go语言数组与切片的使用案例分析 #### 背景介绍 Go语言作为一种现代编程语言,在数据结构处理方面提供了强大的支持。其中,数组和切片是两种常用的数据类型,用于存储相同类型的元素序列。数组是一种固定长度的...
与C#相比,D语言提供了更丰富的内建类型,如动态数组、关联数组和范围。这些内建类型提供了方便的操作,并且在内存管理上更加高效。此外,D语言的模块系统允许更好的代码组织和封装,与C#的命名空间有异曲同工之妙。...
多维数组下标计算是指在计算机科学和编程语言中,对多维数组的元素进行访问和操作的过程。多维数组是指具有多个维度的数组,这种数组可以表示为矩阵、立方体、四维数组等形式。 一、数组(向量) 数组是一种基本的...
D语言是一种现代、通用、面向对象的编程语言,它的设计目标是高效、灵活性高,并且具有C/C++的性能。D语言由Walter Bright在2001年创建,至今已发展到2.0版本,提供了许多现代编程语言的特性。本参考手册详细介绍了D...
C 语言数组实验心得 本文档主要介绍了 C 语言数组的实验心得,包括一维数组和二维数组的定义、赋值和输入输出的方法,字符数组和字符串函数的使用,以及与数组有关的算法特别是排序算法。通过实验和实践,掌握了...
本资源摘要信息中,我们将详细介绍 C 语言数组试题库,涵盖选择题、多选题和程序题等多种题型。这些题目涵盖了 C 语言数组的基本概念、数组定义、数组操作、数组索引、数组赋值等多个方面。 1. 数组定义:在 C 语言...
【语言数组】是编程中的基础概念,特别是在C语言中,数组是一种存储同类型数据集合的数据结构。本PPT教案详细讲解了数组的定义、初始化、赋值、输入输出以及注意事项。 1. **数组定义**: - 数组的定义方式为`类型...
在 C 语言中,数组指针和指针数组是两个容易混淆的概念,但它们之间有着巨大的区别。本文将详细讲解数组指针和指针数组的定义、内存布局、区别,并通过实例代码加深读者的理解。 一、指针数组和数组指针的定义 ...
### D语言程序设计知识点概述 #### 一、D语言概览 **D语言**是一种现代、通用、系统级的编程语言,旨在提供高效且安全的编程体验。它由Digital Mars开发,版本为DMD 0.109,文档经过翻译,其中大部分版权归属...
根据提供的文件信息,我们可以总结出以下关于数组的重要知识点: ### 1. 数组的基本概念 - **数组定义**:数组是一种基本的数据结构,用于存储相同类型的多个数据项。数组中的每个数据项称为一个元素。 - **数组的...
相比之下,Java等其他编程语言可以直接通过函数返回数组,但在C/C++中,我们通常采用两种方法来实现这一功能。 #### 方法一:返回指向数组的指针 第一种常见的方法是通过返回一个指向数组的指针。这种方法的核心...
5. 动态数组和字符串:D语言内建了动态数组和字符串类型,避免了C++中常见的边界检查问题。 6. 多线程支持:D语言内置了对多线程编程的支持,简化并发编程。 7. 标准库:D语言的标准库提供了丰富的功能,包括容器、...
在计算机编程中,特别是C语言及其衍生语言中,指针是一个非常重要的概念。它允许程序员直接访问内存地址,并对其进行操作。当我们深入探讨指针时,会遇到两个看似相似但实际上有很大区别的概念——指针数组和数组...
D语言中的数组可以是固定大小的,也可以是动态大小的。它还支持动态数组(`array`)、关联数组(`associative array`)和范围(`range`),提供了一种简洁的方式来处理序列数据。 5. **类和对象** D语言是面向...