Время жизни и область видимости переменных
В языках С / С++, как и в большинстве остальных ЯВУ есть три типа переменных.
1. Статические. Статическими являются переменные, объявленные вне какой-либо функции, а также объявленные внутри функций и классов с использованием служебного слова static. Такие переменные создаются при запуске программы, уничтожаются при её завершении и доступны из любой функции программы.
2. Автоматические. Это все переменные, объявленные внутри какой-либо функции (кроме объявленных с использованием слова static). Такие переменные создаются при их объявлении и уничтожаются при выходе за пределы операторных скобок фрагмента программы, в котором они определены. Эти переменные размещаются в стеке. Поэтому максимальный размер всех автоматических переменных ограничен размером выделенного стека, на это следует обращать внимание при создании больших автоматический массивов.
3. Динамические. Это переменные, созданные с помощью специальных функций (malloc, calloc и др.) или операций (new, new[]). Временем жизни таких переменных управляет программист. Область видимости определяется доступностью указателей. Такие переменные расположены как правило в «куче» (heap). В Ms Windows при завершении приложения все динамические переменные также уничтожаются в связи с уничтожением кучи, связанной с данным приложением.
Пример (С++).
int main()
{
char a = 5;
…
{
int b = a + 5; //здесь a существует и доступно
…
} //уничтожена переменная b
short c;
c = a + b; // ошибка, т.к. b уже не существует
for(int i = 0;i<10;i++) {…}
c = i; //ошибка, i существует только в теле цикла for
int i=0; //переменная может быть объявлена, т.к. i объявленная выше уже не существует
for(;i<10;i++) {…}
c = i; //допустимо, т.к. i объявлено в этом же блоке
i = 10;
{
int i = 3; //допустимо, перекрывает видимость i, объявленной ранее
…
}
// здесь i=10;
} //уничтожены переменные a,c,i
Указатель на функции
Указатель на функцию используется для передачи точки входа в функцию другой функции в качестве аргумента.
тип_функции (*имя_указателя) (спецификация параметров)
пример:
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *p1, const void *p2);
вызов: fcmp(p1,p2);
функция сравнения чисел:
int comp(const void *p1, const void *p2)
{
return *(int*)p1 - *(int*)p2;
}
Работа с файлами.
Для взаимодействия с файлами предназначена структура данных FILE. Данная структура хранит служебную информацию об открытых файлах, такую как права доступа, указатель на файловый буфер, положение курсора в файле и т.д.
Для работы с файлом его необходимо открыть, для этого предназначена функция
FILE *fopen(const char *filename,const char *mode);
filename – абсолютное или относительное имя файла, mode – режим открытия и доступа.
Режимы:
"r" – открытие существующего файла только для чтения (файл должен существовать);
"w" – создание пустого файла для записи;
"a" – открытие существующего файла для записи данных в конец файла; создание файла, если файла с заданным именем не существует;
"r+" – открытие существующего файла для чтения и записи (файл должен существовать);
"w+" – создание нового файла для чтения и записи;
"a+" – тоже, что “a”, но с возможностью чтения;
Другие функции работы с файлами:
int fclose( FILE *stream ); // 0 в случае успеха
int _fcloseall( void ); //количество закрытых файлов
int fflush(FILE *stream);
int feof( FILE *stream);
int fgetc( FILE *stream);
int fgetpos( FILE *stream, fpos_t *pos);
int fputc(int c, FILE *stream);
int fseek( FILE *stream, long offset, int origin);
long ftell( FILE *stream);
Существуют стандартные файлы (потоки) (тип данных – FILE*):
stdin – стандартный поток ввода (по умолчанию – клавиатура);
stdout – стандартный поток вывода (по умолчанию – монитор в текстовом режиме);
stderr – стандартный поток ошибок;
stdaux – стандартный вспомогательный поток;
stdprn – стандартный принтер.
Данные потоки могут быть переопределены с использованием функции fopen.
Дата добавления: 2015-11-04; просмотров: 767;