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

Will an array of pointers be equal to an array of chars?

我有这个代码:

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 的开头。我必须做出决定,因为如果我试图授予对(例如)writeln(str_ptr[1]); 的访问权限,我会得到很多关于控制台输出的信息。这意味着我正在链接到边界外的元素。

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

您要实现的目标要容易得多:只需索引 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 中检查的范围边界,所以它会中止而不是给你乱码)。唯一需要注意的是数组必须访问内存中的顺序元素。这是T[]在D.

如果所有指针都指向不同的地方,则可以使用指针数组,这些地方不一定按顺序排列。也许您希望第一个指针指向最后一个元素,第二个指针指向第一个元素。或者它们可能都是分配的元素,比如指向对象的指针。在 D 中正确的语法是 T*[] - 从右到左读,"an array of pointers to 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

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