2017-01-21 3 views
0

Я получил этот код:Будет ли массив указателей равным массиву символов?

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]);, я получаю много информации о выходе консоли. Это означает, что я привязываюсь к элементу за пределами границы.

Может кто-нибудь объяснить, если это массив указателей, и если да, то как работает массив указателей в этом случае?

+1

'char [] *' - указатель на массив, а не массив указателей. –

+0

@Adam, как должен выглядеть массив указателей в D? –

+0

См. Мой ответ, это как 'char * []'. –

ответ

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 по умолчанию, поэтому он прерывается, а не дает вам тарабарщину). Единственное замечание состоит в том, что массив должен иметь доступ к последовательным элементам в памяти. Это 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 

Но указатели на массивы являются об изменении длины массива, или, возможно, указывая его что-то совершенно новое и обновляющее оригинал. Нет необходимости делиться с ней отдельными элементами.

Смежные вопросы