что означает это обозначение в c

#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 бит. Возможно, «длина 9 char » было бы лучше.

4. @Tony: спасибо за ваш комментарий. Я всегда рад, когда меня исправляют. Я удалил word, который был явно неправильным термином (я написал его быстро, не слишком задумываясь). Что касается inBuf, я подумал, что говорить об адресах было бы более понятно с точки зрения добавления 9 символов, потому что то, что вы действительно делаете, ссылается на указатель на amp;inBuf (9 * sizeof(char)).