`
qiezi
  • 浏览: 497794 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[D语言] D语言数组

    博客分类:
  • D
阅读更多
先看一段代码:

<!---->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包装成类是个勉强凑合的主意。。。
分享到:
评论
4 楼 sofire 2007-08-06  
看错了,的确和你说的是一致的。:)
3 楼 sofire 2007-08-06  
我得到的结果有点不一样:
B7EF6FE0, B7EF6FE4, B7EF6FE8,
B7EF6FE0, B7EF6FE4,
B7EF6FE0, B7EF6FE4, B7EF6FE8,
B7EF8FE0, B7EF8FE4, B7EF8FE8, B7EF8FEC,

B7EF6FD0, B7EF6FD4, B7EF6FD8,
B7EF6FD0, B7EF6FD4, B7EF6FD8,
B7EF6FD0, B7EF6FD4, B7EF6FD8,
B7EF6FD0, B7EF6FD4,
B7EF6FD0, B7EF6FD4, B7EF6FD8,
B7EF8FC0, B7EF8FC4, B7EF8FC8, B7EF8FCC,

在linux下用的dmd v1.015编译的。
2 楼 qiezi 2007-04-17  
这里分析的是内存分配,初始化自然是必要的,D默认会对数组进行初始化,D文档里面已经描述了这一点。
1 楼 yayv 2007-04-17  
只测试了修改长度,如果修改内容呢?

我的测试结果是,增加长度,会把增加部分进行初始化,缩短长度则不会变化。

增加长度后,与原数组地址不同,再次赋值就将数据写入了不同的地址处。

相关推荐

    D语言中文文档 D语言中文文档

    D语言是一种现代化、高效且可移植的编程语言,由沃德·坎宁安(Walter Bright)设计。它结合了C/C++的性能与现代语言的特性,旨在提供一种更安全、更快速、更易于编写和维护的编程环境。D语言中文文档是针对中国...

    c 语言数组结构实例

    从给定的文件标题“C语言数组结构实例”和描述中,我们可以提炼出关于C语言中数组处理的关键知识点。以下是对这些知识点的详细解析: ### C语言中的数组 #### 动态数组 在C语言中,标准数组是在编译时就确定了大小...

    CCC语言数组详细讲解

    【CCC语言数组详细讲解】 数组在编程中是一种基础且重要的数据结构,特别是在C语言中,它扮演着不可或缺的角色。C语言中的数组属于构造数据类型,它由相同类型的多个变量按有序的形式组织。数组元素可以是基本数据...

    D语言真相 The Case for D(1-5)

    同时,D语言的数组索引越界检查也是其安全性的一大亮点,能有效防止许多常见的运行时错误。 在性能上,D语言并不逊色于C++。由于可以直接生成机器码,D语言的程序执行速度快,而且它的模板元编程和内联函数等功能,...

    go语言数组切片的使用案例

    ### Go语言数组与切片的使用案例分析 #### 背景介绍 Go语言作为一种现代编程语言,在数据结构处理方面提供了强大的支持。其中,数组和切片是两种常用的数据类型,用于存储相同类型的元素序列。数组是一种固定长度的...

    D语言白皮书及语法(中文)

    与C#相比,D语言提供了更丰富的内建类型,如动态数组、关联数组和范围。这些内建类型提供了方便的操作,并且在内存管理上更加高效。此外,D语言的模块系统允许更好的代码组织和封装,与C#的命名空间有异曲同工之妙。...

    多维数组下标计算 多维数组下标计算 多维数组下标计算

    多维数组下标计算是指在计算机科学和编程语言中,对多维数组的元素进行访问和操作的过程。多维数组是指具有多个维度的数组,这种数组可以表示为矩阵、立方体、四维数组等形式。 一、数组(向量) 数组是一种基本的...

    D 语言编程中文参考手册

    D语言是一种现代、通用、面向对象的编程语言,它的设计目标是高效、灵活性高,并且具有C/C++的性能。D语言由Walter Bright在2001年创建,至今已发展到2.0版本,提供了许多现代编程语言的特性。本参考手册详细介绍了D...

    大一c语言数组实验心得.docx

    C 语言数组实验心得 本文档主要介绍了 C 语言数组的实验心得,包括一维数组和二维数组的定义、赋值和输入输出的方法,字符数组和字符串函数的使用,以及与数组有关的算法特别是排序算法。通过实验和实践,掌握了...

    很好的C语言数组试题库哦

    本资源摘要信息中,我们将详细介绍 C 语言数组试题库,涵盖选择题、多选题和程序题等多种题型。这些题目涵盖了 C 语言数组的基本概念、数组定义、数组操作、数组索引、数组赋值等多个方面。 1. 数组定义:在 C 语言...

    语言数组PPT学习教案.pptx

    【语言数组】是编程中的基础概念,特别是在C语言中,数组是一种存储同类型数据集合的数据结构。本PPT教案详细讲解了数组的定义、初始化、赋值、输入输出以及注意事项。 1. **数组定义**: - 数组的定义方式为`类型...

    数组指针和指针数组的区别

    在 C 语言中,数组指针和指针数组是两个容易混淆的概念,但它们之间有着巨大的区别。本文将详细讲解数组指针和指针数组的定义、内存布局、区别,并通过实例代码加深读者的理解。 一、指针数组和数组指针的定义 ...

    D语言程序设计(用D语言编程)

    ### D语言程序设计知识点概述 #### 一、D语言概览 **D语言**是一种现代、通用、系统级的编程语言,旨在提供高效且安全的编程体验。它由Digital Mars开发,版本为DMD 0.109,文档经过翻译,其中大部分版权归属...

    语言数组PPT课件.pptx

    根据提供的文件信息,我们可以总结出以下关于数组的重要知识点: ### 1. 数组的基本概念 - **数组定义**:数组是一种基本的数据结构,用于存储相同类型的多个数据项。数组中的每个数据项称为一个元素。 - **数组的...

    在C中如何使函数返回数组

    相比之下,Java等其他编程语言可以直接通过函数返回数组,但在C/C++中,我们通常采用两种方法来实现这一功能。 #### 方法一:返回指向数组的指针 第一种常见的方法是通过返回一个指向数组的指针。这种方法的核心...

    关于D语言

    5. 动态数组和字符串:D语言内建了动态数组和字符串类型,避免了C++中常见的边界检查问题。 6. 多线程支持:D语言内置了对多线程编程的支持,简化并发编程。 7. 标准库:D语言的标准库提供了丰富的功能,包括容器、...

    指针数组与数组指针

    在计算机编程中,特别是C语言及其衍生语言中,指针是一个非常重要的概念。它允许程序员直接访问内存地址,并对其进行操作。当我们深入探讨指针时,会遇到两个看似相似但实际上有很大区别的概念——指针数组和数组...

    学习D语言的tango:第二章 D语言基础

    D语言中的数组可以是固定大小的,也可以是动态大小的。它还支持动态数组(`array`)、关联数组(`associative array`)和范围(`range`),提供了一种简洁的方式来处理序列数据。 5. **类和对象** D语言是面向...

Global site tag (gtag.js) - Google Analytics