- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
184 Глава 4
Выражение (sizeof pstr) / (sizeof pstr [0] ) делит число байт, занятых масси- вом указателей на число байт, занятых первым его элементом. Поскольку каждый эле- мент массива занимает одно и то же место в памяти, в результате получается число элементов массива.
Помните, что pstr — это массив указателей. Применение операции sizeof ко всему мас- сиву или отдельным его элементам ничего не скажет нам о памяти, занятой текстовыми строками.
Операцию sizeof также можно применять к имени типа вместо переменной — в этом случае результат означает количество байт, занятых каждой переменной данно- го типа. И в этом случае имя типа должно быть заключено в скобки. Например, после выполнения оператора:
переменная size получает значение 4. Эта переменная объявлена с типом size_t, чтобы обеспечить соответствие типу значения, которое возвращает операция sizeof. Использование другого целочисленного типа для этой переменной может привести к появлению предупреждающих сообщений компилятора.
Массивы,
строки
и
указатели
Описание полученных результатов
Как видите, необходимое изменение в этом примере очень простое. Мы вычисля- ем количество элементов в массиве указателей pstr и сохраняем результат в перемен- ной count. Затем везде, где было указано общее количество элементов массива (6), мы просто вставляем переменную count. Теперь вы можете добавлять новые имена в список счастливых звезд, и программа "подгоняется" автоматически.
Константные указатели и указатели на константы
Очевидно, что массив pstr в последнем примере не предназначен для того, чтобы быть модифицированным, как не должны модифицироваться строки, на которые ука- зывают его элементы, как и не должна модифицироваться переменная count. Было бы неплохо каким-то образом гарантировать, чтобы все эти вещи не могли быть оши- бочно изменены в программе. Переменную count очень легко защитить от непредна- меренной модификации, написав так:
Однако массив указателей требует более тщательного рассмотрения. Массив объ- явлен следующим образом:
Каждый указатель в массиве инициализирован адресом строчного литерала — "Robert Redford", "Hopalong Cassidy" и так далее. Типом строчного литерала являет- ся массив const char, поэтому получается, что вы сохраняете адрес константного массива в не константном указателе. Причина, по которой компилятор позволяет использовать строчные литералы для инициализации элементов массива char *, за- ключается в необходимости обеспечения обратной совместимости с существующим кодом.
Если вы попытаетесь изменить символьный массив оператором вроде следующего:
то программа не скомпилируется.
Если вы сбросите один из элементов массива в указатель на символ посредством оператора:
то программа скомпилируется, но потерпит крах при выполнении этого оператора.
Конечно, вы не хотели бы получить непредсказуемое поведение программы, вро- де краха во время выполнения, и вы можете предотвратить его. Более удачный спо- соб написания объявления массива будет таким: