Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

Если хотите копировать, то используйте класс, аналогичный классу

vector
. Код копирования объектов класса
vector
, эквивалентный приведенному выше, можно записать следующим образом:

vector<int> x(100);

vector<int> y(100);

// ...

x = y; // копируем 100 чисел типа int

18.5.3. Инициализация массива

Массивы имеют одно значительное преимущество над векторами и другими контейнерами, определенными пользователями: язык С++ предоставляет поддержку для инициализации массивов. Рассмотрим пример.

char ac[] = "Beorn"; // массив из шести символов

Подсчитайте эти символы. Их пять, но

ac
становится массивом из шести символов, потому что компилятор добавляет завершающий нуль в конце строкового литерала.

Строка, завершающаяся нулем, является обычным явлением в языке С и многих системах. Такие массивы символов, завершающиеся нулем, мы называем строками в стиле языка С (C-style string). Все строковые литералы являются строками в стиле языка C. Рассмотрим пример.

char* pc = "Howdy"; // указатель pc ссылается на массив из шести

// символов

Графически это можно изобразить следующим образом.

Переменная типа

char
, имеющая числовое значение
0
, — это не символ
'0'
, не буква и не цифра. Цель этого завершающего нуля — помочь функции найти конец строки. Помните: массив не знает своего размера. Полагаясь на использование завершающего нуля, мы можем написать следующий код:

int strlen(const char* p) // похоже на стандартную функцию strlen

{

int n = 0;

while (p[n]) ++n;

return n;

}

На самом деле мы не обязаны определять функцию

strlen
, поскольку это уже стандартная библиотечная функция, определенная в заголовочном файле
<string.h>
(разделы 27.5 и Б.10.3). Обратите внимание на то, что функция
strlen
подсчитывает символы, но игнорирует завершающий нуль; иначе говоря, для хранения
n
символов в строке в стиле языка С необходимо иметь память для хранения n+1 переменной типа
char
.

Только символьные массивы можно инициализировать с помощью литеральных констант, но любой массив можно инициализировать списком значений его элементов соответствующего типа. Рассмотрим пример.

int ai[] = { 1, 2, 3, 4, 5, 6 }; // массив из шести чисел

// типа int

int ai2[100] = { 0,1,2,3,4,5,6,7,8,9 }; // остальные 90 элементов

// инициализируются нулем

double ad[100] = { }; // все элементы инициализируются нулем

char chars[] = { 'a', 'b', 'c' }; // нет завершающего нуля!

Обратите внимание на то, что количество элементов в массиве

ai
равно шести (а не семи), а количество элементов в массиве
chars
равно трем (а не четырем), — правило “добавить нуль в конце” относится только к строковым литералам. Если размер массива не задан явно, то он определяется по списку инициализации. Это довольно полезное правило. Если количество элементов в списке инициализации окажется меньше, чем количество элементов массива (как в определениях массивов
ai2
и
ad
), остальные элементы инициализируются значениями, предусмотренными для данного типа элементов по умолчанию.

18.5.4. Проблемы с указателями

Как и массивами, указателями часто злоупотребляют. Люди часто сами создают себе проблемы, используя указатели и массивы. В частности, все серьезные проблемы, связанные с указателями, вызваны обращением к области памяти, которая не является объектом ожидаемого типа, причем многие из этих проблем, в свою очередь, вызваны выходом за пределы массива. Перечислим эти проблемы.

• Обращение по нулевому указателю.

• Обращение по неинициализированному указателю.

  • Читать дальше
  • 1
  • ...
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: