Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Марченко А.Л. -> "С++ бархатный путь " -> 41

С++ бархатный путь - Марченко А.Л.

Марченко А.Л. С++ бархатный путь — М.: Горячая линия - Телеком, 2005. — 399 c.
ISBN 5-93517-056-6
Скачать (прямая ссылка): barhatniyput2005.djvu
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 152 >> Следующая

Возможна частичная инициализация массива. При этом начальные значения получают первые элементы массива:
int intArray_5[3] (1,21;
В этом определении массива означены лишь первые два элемента массива. Значение последнего элемента массива в данном случае не определено.
Здесь нужно отметить одну особенность синтаксиса инициализатора массива. Речь идёт о необязательной запятой в конце списка инициализаторов. По-видимому, её назначение заключается в том, чтобы указывать на факт частичной инициализации массива.
Действительно, последний вариант (частично) инициализирующего оператора определения массива выглядит нагляднее:
int IntArгау_5[3] “ {1,2, J;
Последняя запятая предупреждает о факте частичной инициализации массива. Затраты на связывание запятой в конце списка инициализаторов со строго определённым контекстом частичной инициализации оказываются столь значительными, что последняя запятая традиционно (по крайней мере со времени выхода "Справочного руководства по языку программирования C++") считается всего лишь необязательным элементом любой (в том числе и полной) инициализации.
int intAxray_6ІЗ] *» (1,2,31;
int intArray_6[3] - 11,2,3,1; // Полна* инициализация с запятой.
int intArray_6n e (1,2,3); int intArray_6[] “ {1,2,3,};
Между этими операторами нет никакой разницы. А вот в таком контексте
int intArray_6[3] » (1,2, );
// Частичная инициализация массива ил трёх элементов..
Последняя запятая в фигурных скобках - не более как полезное украшение. Что-то недосказанное таится в таком операторе присвоения...
int intArгау_7 (] ;
101
А вот это некорректное объявление. Без спецификатора extern транслятор воспринимает его как ошибку. В скором времени мы обсудим причину этого явления.
Свойства массивов
Первое специфическое свойство массивов заключается в том, что определение массива предполагает обязательное указание его размеров. Зафиксировать размер массива можно различными способами (о них мы уже говорили), однако это необходимо сделать непосредственно в момент его объявления, в соответствующем операторе объявления.
В программе, состоящей из нескольких файлов, массив определяется в одном из файлов программы. В остальных файлах при объявлении этого массива используется спецификатор extern. Подобное объявление может быть включено и в главный файл. Главное, чтобы транслятор мог различить объявления и собственно определение.
В объявлениях со спецификатором extern можно указывать произвольные размеры объявляемого массива (лишь бы они были описаны в виде константного выражения), а можно их и не указывать вовсе - транслятор всё равно их не читает.
int intArrayl[10] - |0,1,2,3,4,5,6,7,В,9); extern intArrayl[); extern intArrayl[1000];
/•Казалось вы, если транслятор ас* равнс не читает значение константного выражения в объявлении, то почему бы там не эЛпнсвть выражение, содержащее переменные? */ int AxrVal - 99;
extern intArrayl[ArrVal + 1];
/•Однако этого сделать нельзя. ArrVal м« константное выражение.*/
Но зато он очень строго следит за попытками повторной инициализации.
Второе свойство массивов заключается в том, что объекту типа массив невозможно присвоить никакого другого значения, даже если это значение является массивом аналогичного типа и размерности:
char chArray_l[б] ;
char chArray_2U *¦ I 'q' , '•»' , 'a' , 'r' , ’t' , ’y' ) ;
Попытка использовать оператор присвоения вида
chArray_l « chArray_2;
вызывает сообщение об ошибке, суть которой сводится к уведомлению, что выражение chArray_1 не является леводопустимым выражением.
102
Следует заметить, что подобным образом ведёт себя и константный указатель, с которым мы познакомились раньше. Он также требует немедленной инициализации (это его единственный шанс получить определённое значение) и не допускает последующего изменения собственного значения.
Часто указатель один "знает" место расположения участка памяти, выделенного операциями или функциями распределения памяти. Изменение значения этого указателя приводит к потере ссылки на расположенный в динамической памяти объект. Это означает, что соответствующая область памяти на всё оставшееся время выполнения программы оказывается недоступной.
По аналогичной причине невозможна и операция присвоения, операндами которой являются имена массивов.
Операторы
intXctayl ш intXrray2; intArrey1[J ¦ intArray2I1;
не допускаются транслятором исключительно по той причине, что имя массива аналогично константному указателю. Оно является неизменяемым I-выражением, следовательно, не является леводопустимым выражением и не может располагаться слева от операции присвоения.
Заметим, что при создании в динамической памяти с помощью выражения размещения безымянных массивов объектов (при инициализации указателей на массивы) инициализаторы не допускаются. Инициализатор в выражении размещения может проинициализировать только один объект. И дело здесь не в особых свойствах выражения размещения, а в особенностях языка и самого процесса трансляции.
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 152 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.