我有这段代码:
else
我认为我正在创建一个指针数组import std.stdio;
import std.string;
void main()
{
char [] str = "aaa".dup;
char [] *str_ptr;
writeln(str_ptr);
str_ptr = &str;
*(str_ptr[0].ptr) = 'f';
writeln(*str_ptr);
writeln(str_ptr[0][1]);
}
,因此每个指针都会指向一个char [] *str_ptr
。但看起来char
指向字符串str_ptr
的开头。我必须做出决定,因为如果我试图访问(例如)str
我将获得有关控制台输出的大量信息。这意味着我正在链接到边界之外的元素。
有人可以解释它是否是一个指针数组,如果是,那么指针数组在这种情况下是如何工作的?
答案 0 :(得分:2)
你想要实现的目标要容易得多:只需索引char数组本身。无需通过明确的指示。
import std.stdio;
import std.string;
void main()
{
char [] str = "aaa".dup;
str[0] = 'f';
writeln(str[0]); // str[x] points to individual char
writeln(str); // faa
}
D中的数组已经是内部的指针 - 它由指向其元素的指针组成,并且索引它可以将您带到这些单独的元素。 str[1]
导致第二个字符(请记住,它从零开始),与*(str.ptr + 1)
完全相同。实际上,编译器会生成那么多代码(虽然默认情况下加上D中的范围边界检查,所以它会中止而不是给你乱码)。唯一需要注意的是,数组必须访问内存中的顺序元素。这是D中的T[]
如果所有指针都指向不同的位置,则可能会使用指针数组,这些指针不一定按顺序排列。也许你想要第一个指针转到最后一个元素,第二个指针指向第一个元素。或者它们都是分配的元素,比如指向对象的指针。 D中的正确语法是T*[]
- 从右到左阅读,"指向T"的指针数组。
指向数组的指针在D中非常罕见,它是T[]*
,但是当您需要更新另一个函数持有的其他数组的长度时,可以使用它。例如
int[] arr;
int[]* ptr = &arr;
(*ptr) ~= 1;
assert(arr.length == 1);
如果ptr
不是指针,则arr
长度不会更新:
int[] arr;
int[] ptr = arr;
ptr ~= 1;
assert(arr.length == 1); // NOPE! fails, arr is still empty
但是指向数组的指针是关于修改数组的长度,或者可能将其指向全新的并更新原始数据。在其中共享单个元素是没有必要的。