d中数组与切片

数组是(针,长度)对.

struct Y { double q; }
struct X { Y[] a; }

X x;

auto r = x.a;//r复制了x.a的(针,长度)对
 #! /usr/bin/env rdmd
  import std.stdio;

  struct X { int[] a; }

  void main() {
      auto test = X([0]);
      test.a.reserve(10); // for later
      auto r = test.a;
      writeln(test.a.ptr == r.ptr); // true
      writeln(test.a.length == r.length); // true
  }
//修改后:
     r ~= [1];//复制后的,这基本上是另一个数组了
      writeln(test.a.ptr == r.ptr); //true(不一定)
      writeln(test.a.length == r.length); // false

//考虑如下:
  #! /usr/bin/env rdmd
  import std.stdio;
  struct X { int[] a; }
  void main() {
      X test;
      test.a.reserve(3);
      auto a = test.a;
      a ~= [1, 2, 3];//操作的是指针的内容,而不是长度
    
    //这里的test.a,3个之内,是已存在的量.更新已存在量,是会反映到另一个的
      auto r = test.a.ptr[0..3];//必须切片,敏感,数组操作,新数组了
      writeln(r); // output: [1, 2, 3]
  }
//如下:
 #! /usr/bin/env rdmd
  import std.stdio;

  struct X { int[] a; }

  void main() {
      X test;
      test.a.reserve(3);
      auto a = test.a;
      a ~= [1, 2, 3];
      test.a.length = 3;//直接赋值长度,重新改变了
      writeln(test.a); // [0,0,0]
      writeln(a); // [1,2,3]
      writeln(typeid(a)); // output: int[]*
        //说明,a为数组指针.
  }//操作,然后赋值回

r为指针,d没有引用类型,r的真正类型为整[]*,
//对每个(针,数组)的改变,都不变影响另一个.但对针的改变会相互影响.因为开始时两个针指向相同地址.
可以这样:*r ~= Y(10.0); * 为解引用

int[] a = [0, 1, 2];
int[] b = a;//b==a,但b与a互相不是另一个的引用
//更新`已存在的量`会反射到另外一个.
a ~= 10;
assert(a.length == 4);
assert(b.length == 3);

writeln(a); // prints [0, 3, 2, 10];
writeln(b); // prints [0, 3, 2];
//对(针,数组)的改变,则不会,根据是否分配内存,针指向同一地址.其实应该就是在还未分配前的一段空的空间里面,应该是针与针还是一样的

假定安全附加告诉运行时,你想重用数组背后的已存在内存块.附加时,没必要重新分配内存.
你能直接按引用调整数组吗?

void myAlgo(ref Y[] arr) {
    arr ~= Y(10.2);
}

按引用或指针,并直接操作数组?:

void myAlgo(ref X x) {
    x.a ~= Y(10.2);
}
posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示