Я просматриваю некоторый низкоуровневый код Objective-C и вижу вот это:
Byte seq[termLength];
(termLength is a NSUInteger, which is a unsigned long in my environment; Byte is a UInt8, which is a unsigned char)
Я не так хорошо знаком с частью C в Objective-C ... что это делает? На мой взгляд, это выглядит так, как будто он создает новый массив Byte с именем seq, который имеет длину termLength, без инициализации памяти в нем, но позже я вижу это:
memcpy(seq + bufLen, pre, preLen);
Я очень запутался в этой части. bufLen - это NSUInteger. Как добавить NSUInteger к Byte[]? Что бы это вообще сделало?





Вы описываете массив C. Вы можете прочитать о массивах C здесь:
https://en.wikibooks.org/wiki/C_Programming/Arrays_and_strings
Массивы C могут использоваться как указатели, включая арифметику указателей. Итак, если вы добавите bufLen к seq, то в итоге вы получите указатель на позицию байтов bufLen в seq. Итак, (seq + buflen)[0] дает вам тот же байт, что и seq[bufLen], (seq + buflen)[1] дает вам seq[bufLen + 1] и т. д. Надеюсь, bufLen меньше, чем termLength.
@BenLeggiero Вот и все.
Он эффективно берет часть массива, если это помогает?
Я получаю противоречивую информацию от CharlesSrstka и @zwol ... Это элемент в слоте массива или это целый фрагмент массива?
Это новый указатель, который начинается где-то в середине массива. Поскольку указатели и массивы имеют аналогичный синтаксис в C, вы действительно можете рассматривать его как часть массива.
Я понимаю! Итак, memcpy, вероятно, будет использовать его как массив, учитывая, как его использовал писатель, но этот синтаксис ничем не отличается по поведению от memcpy(seq[bufLen], pre, preLen)?
@BenLeggiero Закрыть. Это будет то же поведение, что и memcpy(&seq[bufLen], pre, preLen). Просто seq[bufLen] даст вам сам символ, а не указатель на него. Вам нужен указатель (или массив, который превращается в указатель с помощью магии компилятора), поскольку это то, что memcpy ожидает от своего первого аргумента.
Спасибо, @CharlesSrstka! Извините, если я кажусь немного невежественным, но я вырос на Java, поэтому вся эта игра с указателями мне чужда.
@BenLeggiero Через некоторое время ты освоишься. И как только вы это сделаете, вам станет не хватать синтаксиса явного указателя при написании на современных языках. Например; предположим, у вас есть массив. Затем вы создаете новую переменную массива и назначаете ей первый массив. Затем вы изменяете второй массив. Изменится ли и первый массив? Ответ: Зависит от языка. Свифт: Нет. Java: Да. Вы в основном должны отслеживать, является ли каждый тип типом значения или типом ссылки, на язык, чтобы знать, что произойдет. В C вы просто видите, есть ли *, и вы знаете. Блин, детки! Слезь с моей лужайки.
Итак, вторая половина вопроса: что означает
seq + bufLen?