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

Pointers 指针数组是否等于字符数组?,pointers,d,Pointers,D,我有这个密码: 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]); } 我认为我正在创建一

我有这个密码:

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中加上范围边界检查,所以它会中止而不是给您胡言乱语)。唯一需要注意的是,数组必须访问内存中的顺序元素。这是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

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

您要实现的是更容易的:只需为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

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

char[]*
是指向数组的指针,而不是指针数组。@Adam,D中的指针数组应该是什么样子?看我的答案,它就像
char*[]
char[]*
是指向数组的指针,而不是指针数组。@Adam,D中的指针数组应该是什么样子的?请看我的答案,它类似于
char*[]