2013-04-18 3 views
2

Это, наверное, глупый вопрос. Играя с C++ и найти эту строку кода, которая заставляет меня немного запуталсяДополнение к массиву char

char buffer[7] = {'0', '1', '0', '9', '0', '1'}; 

// It prints 010901 
printf("%s", buffer); 

// It prints 0901 
printf("%s", buffer+2); 

Почему мы можем (+ 2) переменная буфер, и это как сдвинуты 2 символа вправо?

+0

Вы хотите напечатать, как если бы мы переместили все элементы на 2 вправо? – Infested

+0

Я просто хочу знать, почему я могу сделать буфер + 2? – BigBoss

ответ

6

В контексте, таком как это, имя массива buffer «ухудшает», будучи просто указателем на первое значение. Поскольку C и C++ поддерживают указательную арифметику, а строки представлены как указатели на массивы символов, это нормально.

Обратите внимание на символ окончания '\0', что подразумевается, так как вы указываете больший размер, чем вы предоставляете данные инициализации.

Тем не менее, ваш код может быть упрощена:

const char buffer[] = "010901"; 

Вы можете себе это так:

   +-----+-----+-----+-----+-----+-----+-----+ 
buffer ------> | '0' | '1' | '0' | '9' | '0' | '1' | '\0 | 
       +-----+-----+-----+-----+-----+-----+-----+ 
          ^
           | 
           | 
         buffer + 2 
+1

Неужели это просто удача? Если массив был больше, чем количество указанных элементов, не являются ли остальные элементы инициализированными по умолчанию, которые сделают их равными нулю? – Yexo

+0

% s все равно будет печатать до конца символа. % c даст символ, но я думаю, что это не то, что он имел в виду – Infested

+0

Привет, я точно знаю, что это значит. Спасибо за ответ – BigBoss

1

Выражения типа массива часто претерпевают преобразование массива в-указатель. В принципе, имя buffer здесь может быть преобразовано в указатель на его первый элемент. Вот что происходит в обоих случаях. Массив преобразуется в char*, а затем printf интерпретирует это как указание на первый символ в строке стиля C.

Во втором случае после преобразования в указатель вы добавляете 2 к этому указателю. Это дает вам указатель на третий элемент. printf снова рассматривает это как строку C-стиля, но начиная с третьего символа созданного массива.

Сначала я думал, что у вас возникла проблема с тем, что ваша строка не была завершена нуль. Однако ваш код в порядке, потому что массив имеет размер 7, а последний элемент будет установлен в 0, потому что вы не укажете для него инициализатор. Однако это путает. Я рекомендую вам вместо этого объявить массив следующим образом:

char buffer[] = "010901"; 
0

C++ определяет неявное преобразование между строками; то есть массив неявно конвертируется в указатель на его первый элемент (элемент с индексом 0). Это означает, что ваш код basicaly iterpreted так:

printf("%s", (&buffer[0]) + 2); 
0
char buffer[7] = {'0', '1', '0', '9', '0', '1' , '\0'}; 

Имя массива в C, в основном также указатель на ячейку массива

buffer[i] переводится как *(buffer+i) т.е. добавить i к значению указателя [следует за арифметикой указателей]. Таким образом, он дает адрес в этом месте. printf распечатает %s, пока не встретит \n. Следовательно, выход.

Проверить this знать о указателях и массивах

0

Вы должны NUL-прекратить эту строку, братан!

char buffer[7] = {'0', '1', '0', '9', '0', '1', '\0'}; 

// It prints 010901 
printf("%s", buffer); 

// It prints 0901 
printf("%s", buffer+2); 
Смежные вопросы