То, что вы пытаетесь достичь, гораздо проще сделать: просто проиндексируйте массив 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*[]
- читайте справа налево «массив указателей на 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 * []'. –