指针数组是否等于字符数组?

时间:2017-01-21 16:11:12

标签: pointers d

我有这段代码:

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我将获得有关控制台输出的大量信息。这意味着我正在链接到边界之外的元素。

有人可以解释它是否是一个指针数组,如果是,那么指针数组在这种情况下是如何工作的?

1 个答案:

答案 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

但是指向数组的指针是关于修改数组的长度,或者可能将其指向全新的并更新原始数据。在其中共享单个元素是没有必要的。