Создание нового проекта консольного типа

Страницы работы

Содержание работы

Указатели

Указатели являются очень мощным и гибким средством языка С. Корректное использование указателей позволяет создавать компактные и эффективные программы. Но вместе с мощью приходит и ответственность. Потеря контроля над указателем может привести к очень неприятным последствиям. Наиболее часто в этом случае программа зависает (зацикливается в выполнении). Иногда портится область памяти, занятая операционной системой. В основном это происходит при работе в DOS. В практике автора был случай, когда портилось содержимое СMOS-памяти, так что после запуска ошибочной программы становилась невозможной начальная загрузка системы. Поломка устранялась коррекцией СMOS-данных, но впечатление того, что программа способна сломать компьютер было довольно убедительным. Работая с указателями, необходимо помнить об этом.

Указатель — это адрес памяти. После инициализации он содержит адрес какой-либо переменной. Значение указателя показывает, где в памяти хранится объект, а не что хранится по адресу. Операторный символ * используется для разадресации, то есть выборки содержимого по адресу. Существует обратная операция & взятия адреса. Механизм доступа к переменной с помощью указателя можно представить себе в виде перемещаемого по памяти окошка для просмотра или изменения ее содержимого. Рассмотрим эти возможности на примере. В дальнейшем в тексте примеров с целью экономии места почти везде будут опущены директивы препроцессора #include. Однако при запуске примеров их следует вставить. Так как компилятор указывает на библиотечные функции, которые он не находит, то эти исправления внести несложно.

Практическая работа

Создайте новый проект консольного типа:

1.  Выберите в меню команду File | New | Projects,

2.  В появившемся окне диалога в поле Name задайте имя проекта: MyConsole,

3.  Выберите месторасположение папки с проектом (в поле Location: задайте D:\Users\YourName),

4.  Выберите тип проекта Win32 Console Project и нажмите OK,

5.  Просмотрите настройки проекта на странице Application Settings,

6.  Подтвердите выбор, нажав Finish.

7.  В файл stdafx.h введите следующие директивы препроцессора:

#pragma once

#include <iostream>

#include <tchar.h>

#include <math.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

using namespace std;

Файл stdafx.h, совместно с stdafx.cpp, используется для ускорения повторных компиляций. Подключаемые файлы библиотек, а они внушительны по размерам, компилируются только при первом запуске и если вы вносите изменения в свой код, то компилироваться будет только ваш файл— библиотеки уже скомпилированы и их объектный код расположен в файле MyConsole.pdb (см. папку Debug). После внесения изменений в stdafx.h происходит повторная компиляция всех файлов.

Задание. В результате выполнения задания вы должны приобрести некоторые навыки, необходимые для дальнейшей работы. Выполняя программу по шагам (F10), вы должны объяснять себе те значения переменных, которые будут видны в окне Autos. Примерная последовательность действий:

¨  Уничтожьте весь код в файле MyConsole.cpp и введите тот, что приведен ниже.

¨  Последовательно нажимая F10, выполняйте программу в пошаговом режиме, учитывая что в каждый данный момент времени указатель стоит на строке, которая еще не выполнена. (Она будет выполнена на следующем шаге).

¨  Вы можете поставить (или убрать)точку останова (Breakpoint) на интересующей Вас строке кода (F9) и дать команду "Go" (F5).

¨  Когда выполнение остановится на указанной строке, вы можете продолжать пошаговое выполнение (F10). Выйти из режима отладки можно с помощью комбинации Shift+F5.

¨  Список команд, доступных в режиме отладки, можно увидеть в меню Debug.

#include "stdafx.h"

void main()

{

int *p;       // р - указатель на целое

int v=1947;   // Какая-либо переменная целого типа

p = &v;       // Присвоение указателю значения адреса переменной v

printf ("\n\nVariable v contains: %d",v);

printf ("\n\nThe address %p contains: %d",p,*p);

p = new int; // Захват памяти в области heap

printf ("\n\nNow in heap the address %p contains: %x",p,*p);

*p = 100;

printf ("\n\nAfter assignment the address %p contains: %d",p,*p);

delete p;

printf ("\n\nAfter deletion the address %p contains: %x",p,*p);

}

Объясните результат функционирования примера — три строки текста. Присвоение указателю адреса какой-либо другой переменной позволяет получить ее значение путем разадресации указателя (*p). Обратите внимание на формат вывода адреса %p (pointer) в функции printf. Значения адресов зависят от операционной системы, версии компилятора и момента запуска в многозадачной системе. После выполнения оператора p=&v указатель р содержит адрес переменной v, который компилятор определил для хранения значений этой локальной переменной. Теперь, вплоть до следующего нового присвоения, переменная р указывает на переменную v. Содержимое по адресу р, а именно *p, равно 1947.

Две операции языка C++ (new и delete) позволяют непосредственно управлять временем жизни какой-либо переменной. Переменная может быть создана в любой точке программы с помощью операции new и затем при необходимости уничтожена с помощью операции delete. Пример иллюстрирует применение этих операций. Оператор p = new int; присваивает переменной p адрес начала области памяти длиной в один элемент типа int. Память выделяется динамически из специальной области центрального пула памяти, которая называется heap. Элемент занимает sizeof(int) байт. Операция sizeof(arg) возвращает размер в байтах своего аргумента arg, который может быть либо типом, либо выражением.

Операция delete освобождает ранее занятую память, возвращая ее в heap. Сам указатель при этом продолжает указывать на тот же участок памяти, но он больше ею не управляет. При освобождении памяти нет необходимости явно указывать ее размер, так как эту информацию сохраняет система при реализации операции new. Характерные значения (0xcdcdcdcd и 0xdddddddd) определяются способом работы с динамической памятью, принятым в операционной системе (в данном случае Windows NT). Если программист забывает освободить память, то это остается незамеченным в небольших программах, однако часто приводит к отказам в достаточно серьезных разработках и является плохим стилем программирования.

Задание.

¨  Запишите файл с первым заданием, затем отключите его от проекта (Delete),

¨  Подключите новый файл, назвав его WordControl.cpp.

¨  Введите заготовку приложения, которое вам необходимо развить.

Похожие материалы

Информация о работе