Что делает синтаксис C `Type varname [integer];` при использовании с оператором +?

Я просматриваю некоторый низкоуровневый код 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[]? Что бы это вообще сделало?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы описываете массив 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.

Итак, вторая половина вопроса: что означает seq + bufLen?

Ben Leggiero 16.04.2018 23:44

@BenLeggiero Вот и все.

Charles Srstka 16.04.2018 23:46

Он эффективно берет часть массива, если это помогает?

zwol 16.04.2018 23:46

Я получаю противоречивую информацию от CharlesSrstka и @zwol ... Это элемент в слоте массива или это целый фрагмент массива?

Ben Leggiero 16.04.2018 23:47

Это новый указатель, который начинается где-то в середине массива. Поскольку указатели и массивы имеют аналогичный синтаксис в C, вы действительно можете рассматривать его как часть массива.

Charles Srstka 16.04.2018 23:48

Я понимаю! Итак, memcpy, вероятно, будет использовать его как массив, учитывая, как его использовал писатель, но этот синтаксис ничем не отличается по поведению от memcpy(seq[bufLen], pre, preLen)?

Ben Leggiero 16.04.2018 23:50

@BenLeggiero Закрыть. Это будет то же поведение, что и memcpy(&seq[bufLen], pre, preLen). Просто seq[bufLen] даст вам сам символ, а не указатель на него. Вам нужен указатель (или массив, который превращается в указатель с помощью магии компилятора), поскольку это то, что memcpy ожидает от своего первого аргумента.

Charles Srstka 16.04.2018 23:56

Спасибо, @CharlesSrstka! Извините, если я кажусь немного невежественным, но я вырос на Java, поэтому вся эта игра с указателями мне чужда.

Ben Leggiero 17.04.2018 16:20

@BenLeggiero Через некоторое время ты освоишься. И как только вы это сделаете, вам станет не хватать синтаксиса явного указателя при написании на современных языках. Например; предположим, у вас есть массив. Затем вы создаете новую переменную массива и назначаете ей первый массив. Затем вы изменяете второй массив. Изменится ли и первый массив? Ответ: Зависит от языка. Свифт: Нет. Java: Да. Вы в основном должны отслеживать, является ли каждый тип типом значения или типом ссылки, на язык, чтобы знать, что произойдет. В C вы просто видите, есть ли *, и вы знаете. Блин, детки! Слезь с моей лужайки.

Charles Srstka 17.04.2018 17:59

Другие вопросы по теме