#c #arrays #syntax
#c #массивы #синтаксис
Вопрос:
итак, у меня есть:
char inBuf[80]
и затем есть еще одна строка
inBuf 9
что это значит, когда я добавляю 9 к имени массива?
Ответ №1:
Это то же самое, что ссылаться на элемент номер 9 (основанный на 0).
Эквивалентное обозначение было бы:
amp;inBuf[9]
Если вы хотите получить значение, вы могли бы использовать *(inBuf 9)
Комментарии:
1. Это 10-й элемент… «9-й элемент (на основе 0)» по-прежнему неверно — (было бы «номер элемента 9 (на основе 0)»).
Ответ №2:
Это будет указывать на 10-й элемент массива. Так, например:
*(inBuf 9) = 10
присвоил бы 10 10-му элементу.
Комментарии:
1. 10-й элемент… они основаны на 0.
2. @Tony: Что я могу сказать, вы правы. Спасибо за голосование «против», этот плохой ответ действительно заслужил это!
3. не мой голос против … не переживайте… мы бы никогда не получили хороших ответов по S.O., если бы все чувствовали, что им нужно сделать их идеальными с первого раза … :-).
Ответ №3:
Ответ уже был дан. Возможно, я только повторяю это.
Это называется арифметикой указателей, потому что указатели участвуют в арифметической операции. есть определенные вещи, которые только вы можете делать с указателями.
например, вы можете добавить к нему целое число, но вычесть целое число можно, только если указатель указывает на некоторый массив в памяти.
также вы не можете вычитать указатели, потому что это может привести к некоторой важной ячейке памяти (для ОС).
сложение в арифметике указателей является особенным в том смысле, что оно учитывает тип данных элементов массива, поэтому, когда вы говорите
char inBuf[80]
inBuf 9
оно расширяет область памяти на 9, достаточную для хранения 9 символов (обычно 9 * 1 байт)
int inBuf[80]
inBuf 9
это добавит 9 ячеек памяти, достаточных для хранения 9 целых чисел (обычно 9 * 4 байта).
массив и указатели не всегда совпадают, обратитесь к «экспертному программированию на C» для этого
Также никогда не используйте полиморфную арифметику указателей, обратитесь к «книге Скотта Мейерса» для этого
Ответ №4:
Использование inBuf без квалификатора для используемого индекса массива будет таким же, как просмотр char * inBuf. inBuf 9 будет таким же, как inBuf[9].
Ответ №5:
inBuf 9 означает увеличение адреса inBuf на 9.
Ответ №6:
inBuf ссылается на базовый адрес. но inBuf 9 определяет местонахождение 10-го элемента от базового адреса.
*(inBuf 9) = 34;
Это позволило бы присвоить значение 34 10-му элементу в массиве inBuf.
Комментарии:
1. 10-й элемент… они основаны на 0.
Ответ №7:
Когда вы выполняете сложение с его помощью, идентификатор массива, такой как ваш inBuf
, распадается на указатель на первый элемент в массиве, и добавленное число умножается на размер элемента массива (в данном случае char, который имеет размер 1), чтобы получить новый адрес.
Итак, inBuf 9
это адрес 10-го элемента в массиве, который также может быть выражен как amp;inBuf[9]
. Вы можете использовать его как в:
*(inBuf 9) = ''; // overwrite the 10th element in inBuf with a NUL
const char* p = strchr(inBuf 9, ' '); // find space at or beyond 10th char
Ответ №8:
inBuf аналогичен записи amp;inBuf[0]. Итак, inBuf 9 означает адрес inBuf, добавленный длиной 9 символов (amp;inBuf[9]).
Комментарии:
1. в чем причина раскомментированного значения -1?
2. Это был не я. Хотя я могу понять, откуда вы пришли, я также могу понять, почему кто-то мог проголосовать против: технически
inBuf
может распадаться на указатель, но не делает этого, если это не полезно. Есть вещи, с которыми вы можете делатьinBuf
— в первую очередь привязку кconst
ссылке на массив с шаблонным размером, — с которыми вы не можете этого сделатьamp;inBuf[0]
.3. Кроме того, «слово длиной 9 символов» неверно: «слово» при обсуждении адресов памяти представляет собой единицу памяти, связанную с размером собственного регистра в CPU и / или шириной передачи памяти CPU<->: обычно в наши дни 32 или 64 бита, тогда как
char
обычно составляет 8 бит. Возможно, «длина 9char
» было бы лучше.4. @Tony: спасибо за ваш комментарий. Я всегда рад, когда меня исправляют. Я удалил word, который был явно неправильным термином (я написал его быстро, не слишком задумываясь). Что касается inBuf, я подумал, что говорить об адресах было бы более понятно с точки зрения добавления 9 символов, потому что то, что вы действительно делаете, ссылается на указатель на amp;inBuf (9 * sizeof(char)).