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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现