Читайте также:
|
|
В С++ существует несколько правил, касающихся инициализации массивов. Они ограничивают, когда можно ее осуществлять и определяют, что случится, если количество элементов массива не соответствует количеству элементов инициализатора.
Использовать инициализацию можно ТОЛЬКО при объявлении массива.
Ее нельзя выполнить позже и нельзя присваивать один массив другому:
int card[4] = {3, 6, 8, 10}; // разрешено
int hand[4]; //разрешено
hand[4] = {5, 8, 3, 9}; //не допускается
hand = card; //не допускается
Но, можно использовать индексы и присваивать значения элементам массива индивидуально. При инициализации массива можно указывать меньше значений, чем в массиве объявлено элементов.
Например, float hotelTips[5] = {5.0, 2.5};
Если инициализировать массив частично, то компилятор присваивает остальным элементам нулевые значения. Это значит, что инициализировать весь массив нулями очень легко – для этого достаточно явно инициализировать нулем его первый элемент:
long totals[500] = {0};
Если инициализировать массив таким же образом, но с применением 1, вместо 0, только первый элемент будет установлен в 1, а остальные по-прежнему получат значение 0.
Если при инициализации массива оставить квадратные скобки пустыми, то компилятор самостоятельно пересчитает элементы. Предположим, например, что есть следующее объявление:
short totals[] ={1, 8, 4, 2};
Компилятор сделает totals массивом из пяти элементов.
Инициализация массивов в С++11
В С++11 форма инициализации с фигурными скобками (списковая инициализация) стала универсальной для всех типов. Массивы уже используют списковую инициализацию, но в версии с++11 появились дополнительные возможности.
1. При инициализации массива можно отбросить знак =.
double earn[4] {1.3e5, 1.6e3, 1.1e4, 1.7e4};
2. Можно использовать пустые фигурные скобки для установки всех элементов в 0.
unsigned int counts[10] = {}; // все элементы устанавливаются в 0
float balances[100] {}; // все элементы устанавливаются в 0
3. Списковая инициализация защищает от сужения.
long plifs[] = {25, 92, 3.0}; // не разрешено
char slifs[4] = {‘h’, ‘u’, 1122011, ‘\0’}; // не разрешено
char plifs[] = {‘h’, ‘u’, 112, ‘\0’}; // разрешено
1)Преобразование из типа с плавающей точкой в целочисленный тип является сужением, даже если значение с плавающей точкой содержит после десятичной точки только нули.
2)1122011 выходит за пределы диапазона значений типа char, предполагая, что char занимает 8 бит.
3)Выполняется успешно, несмотря на то, что 112 значение int, но оно находится в рамках диапазона типа char.
Программа 1.Массивы целых чисел.
// arrayone.cpp -- small arrays of integers
#include <iostream>
int main()
{
using namespace std;
int apple[3]; // creates array with three elements
apple[0] = 7; // assign value to first element
apple[1] = 8;
apple[2] = 6;
int applecosts[3] = {20, 30, 5}; // create, initialize array
cout << "Total apple = ";
cout << apple[0] + apple[1] + apple[2] << endl;
cout << "The package with " << apple[1] << " apple costs ";
cout << applecosts[1] << " cents per apple.\n";
int total = apple[0] * applecosts[0] + apple[1] * applecosts[1];
total = total + apple[2] * applecosts[2];
cout << "The total apple expense is " << total << " cents.\n";
getchar();
return 0;
}
Строки
Строка – это серия символов, сохраненная в расположенных последовательно байтах памяти. В С++ доступны два способа работы со строками.
1. Унаследован от С и часто называется строки в стиле С.
2. Основан на библиотечном классе string.
Идея серии символов, сохраняемых в последовательных байтах, предполагает хранение строки в массиве char, где каждый элемент содержится в отдельном элементе массива. Строки предоставляют удобный способ хранения текстовой информации, такой как сообщения для пользователя или его ответы.
Строке в стиле С обладают специальной характеристикой: последним в каждой такой строке является нулевой символ. Этот символ, записываемый как \0, предоставляет собой символ с ASCII-кодом 0, который служит меткой конца строки. Например:
char dog[8] = {‘b’, ‘r’, ‘e’, ‘u’, ‘x’, ‘ ’, ‘R’, ‘E’ }; // это не строка
char cat[8] = {‘d’, ‘f’, ‘a’, ‘s’, ‘d’, ‘t ’, ‘T’, ‘\0’ }; // это строка
Обе эти переменные представляют собой массивы char, но только вторая из них является строкой.
Нулевой символ играет фундаментальную роль в строках стиля С.
Например, в С++ имеется множество функций для обработки строк, включая те, что используются cout. Все они обрабатывают строки символ за символом до тех пор, пока не встретится нулевой символ.
Если вы просите объект cout отобразить такую строку, как cat из примера, он выводит первых семь символов, обнаруживает нулевой символ и останавливается.
Однако если вывести с помощью cout массив dog, который не является строкой, то выведуется 8 символов, и будет продолжать двигаться по помяти байт за байтом, интерпретируя каждый их них, как символ, подлежащий выводу, пока не встретит нулевой символ.
Поскольку нулевые символы, которые по сути представляют собой байты, содержащие нули, встречаются в помяти довольно часто, ошибка быстро обнаружится. Но не стоит трактовать нестроковые символьные массивы как строки.
Пример инициализации массива выглядит громоздким и утомительным – множество одиночных кавычек плюс необходимость следить и помнить о нулевом символе. Существует более простой способ инициализации массива с помощью строки.
Для этого просто используйте строку в двойных кавычнах, которая называется строковой константой или строковым литералом, как показано ниже:
char bird[11] = “Mr. Cheeps”;
// наличие символа \0 подразумевается
char fish[] = “Bubbles”;
// компилятор сам подсчитывает количество элементов
Строки в двойных кавычках всегда неявно включают ограничивающий нулевой символ, поэтому указывать его явно не требуется.
Средства ввода С++ предназначенные для чтения строки с клавиатуры в массив char автоматически добавляют завершающий нулевой символ.
Инициализация массива строкой.
Дата добавления: 2015-08-09; просмотров: 161 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Массивы. | | | Построчное чтение ввода |