ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4255
Скачиваний: 28
Часть I. Язык программирования С
96
переменной в оперативной памяти. Поэтому спецификатор
register
редко используется на практике.
В листинге 7.6 приведен пример использования спецификатора
register
.
Листинг 7.6. Пример использования спецификатора
register
#include <stdio.h>
int n;
int main(void)
{
register int i;
for (i = 0; i < 5; ++i)
++n;
printf("n = %d\n", n); /* печатает n = 5 */
return 0;
}
7.5. Структура программы
Программа на языке программирования C состоит из определе-
ний переменных и функций, которые размещаются в одном или
нескольких текстовых файлах. Как уже говорилось в
разд. 7.3
,
такие файлы называются
исходными файлами
или
единицами
компиляции
. Если в исходном файле используются функции или
переменные из других файлов, то они должны быть объявлены
перед своим использованием. Для объявления функций исполь-
зуются их прототипы, а для объявления переменных — ключевое
слово
extern
.
Подготовка исполняемого файла программы осуществляется в
два этапа. Сначала компилируются все исходные файлы про-
граммы. Результатом компиляции исходных файлов являются
объектные файлы
, которые содержат исполняемый код програм-
мы, но в которых не разрешены ссылки на переменные и функ-
ции, определенные в других объектных файлах. Если компиляция
Глава 7. Структура программы на языке С
97
прошла успешно, то можно создать исполняемый модуль. Для
этого вызывается программа, которая называется
компоновщик
или
редактор связей
(linker). Эта программа разрешает внешние
ссылки и создает исполняемый файл.
Исполняемая программа на языке C имеет структуру, которая
показана на рис. 7.1. То есть исполняемая программа представля-
ет собой непрерывный блок памяти, который состоит из четырех
частей:
программный код;
глобальные переменные;
куча;
стек.
Рис. 7.1.
Структура программы
Стек предназначен для хранения адресов возврата из функций,
значения аргументов функций и локальных переменных. Куча
предназначена для динамического выделения памяти программе.
Размеры стека и кучи задаются при вызове программы. Значения
этих величин, заданные по умолчанию, зависят от операционной
системы. Также отметим, что стек и куча растут навстречу друг
другу.
7.6. Функция
main
Каждая программа на языке C должна содержать одну функцию с
именем
main
. При вызове программы средой исполнения или опе-
рационной системой управление передается этой функции.
Функция
main
имеет один из следующих прототипов:
Часть I. Язык программирования С
98
int main(void);
int main(int argc, char **argv, char **envp);
int main();
Во втором случае операционная система передает функции
main
три параметра
argc
,
argv
и
envp
. Первые два параметра являются
обязательными, а третий параметр может отсутствовать. Пара-
метры функции
main
имеют следующее назначение:
argc
— определяет количество элементов в массиве
argv
;
argv
— указатель на массив указателей на строки, которые пе-
редаются программе при ее вызове;
envp
— указатель на массив указателей на строки, которые
описывают среду исполнения программы, последняя строка
в массиве имеет нулевую длину.
Если в среде исполнения доступно имя программы, то указатель
на строку с именем программы хранится первым в массиве указа-
телей, на который указывает параметр
argv
. Если имя программы
недоступно, то первый элемент этого массива указывает на пус-
тую строку.
Параметры исполняемой программе передаются при ее запуске.
Способ запуска программы зависит от операционной системы.
Например, при запуске исполняемого файла из командной строки
аргументы функции
main
записываются после имени программы.
В листинге 7.7 приведен текст функции
main
, которая распечаты-
вает свои параметры.
Листинг 7.7. Печать параметров функции
main
#include <stdio.h>
int main(int argc, char *argv[], char *argp[])
{
int i;
printf("Program name: %s\n", argv[0]);
for (i = 1; i < argc; ++i)
printf("argument %d: %s\n", i, argv[i]);
Глава 7. Структура программы на языке С
99
printf("Environment:\n");
while(*argp)
puts(*argp++);
return 0;
}
В языке программирования C спецификатор класса памяти
static
при определении функции
main
игнорируется.
В языке программирования C++ на функцию
main
накладываются
следующие ограничения:
нельзя получить адрес функции
main
;
нельзя вызвать функцию
main
внутри программы;
нельзя объявить
main
, как статическую функцию.
нельзя объявить функцию
main
как встроенную;
функцию
main
нельзя перегрузить.
По соглашению в случае успешного завершения функция
main
должна вернуть нулевое значение, а в противном случае — код
ошибки.
Г Л А В А
8
Типы данных, определяемые
программистом
8.1. Введение
При разработке программ могут потребоваться типы данных, от-
личные от типов данных, встроенных в язык программирова-
ния С. Введение новых типов данных преследует три цели:
ограничить множество значений существующего интегрально-
го типа данных;
определить тип, который описывает данные, имеющие слож-
ную структуру;
переименовать тип данных, чтобы придать ему более осмыс-
ленное имя.
В первом случае используются перечисления, которые содержат
только необходимые элементы из базового интегрального типа.
Во втором случае используются структурные или составные типы
данных. В языке программирования C программист может конст-
руировать структурные типы данных, используя такие конструк-
ции, как
структуры
и
объединения
.
В третьем случае используется определение
typedef
.
Все эти подходы к конструированию и определению новых типов
данных будут рассмотрены в этой главе.
Объявляются новые типы данных так же, как и переменные вне
блока или в начале блока.