- •Введение
- •Глава 1. Основы.
- •Int main()
- •1.2. Методика создания программ в Microsoft Visual Studio.
- •Void main(){
- •1.3. Ввод-вывод.
- •1.4. Переменные и константы.
- •Int I; // объявление целочисленной переменной
- •42 // Десятичная константа
- •0X42 // шестнадцатеричная константа, начинается с 0х
- •042 // Восьмеричная константа, начинается с 0
- •1.5. Арифметические операции.
- •Void main()
- •1.6. Встроенные функции. Математические функции. Состав math.H.
- •Void main()
- •Int rand(void); // функция используется без аргумента
- •Глава 2. Операторы и выражения.
- •2.1. Логические выражения и операторы
- •2.1.1. Оператор if else
- •If (условие)
- •If (условие)
- •2.1.2. Конструкция if else if
- •Int number;
- •Int number;
- •2.1.3. Условный оператор.
- •2.1.4. Оператор switch.
- •Int dvalue;
- •2.2. Операторы цикла.
- •2.2.1. Оператор for
- •Void main()
- •Int I; // создаем переменную цикла
- •Void main()
- •Int I; // переменную цикла можно определить и вне цикла
- •2.2.2. Изменение шага цикла
- •Void main()
- •2.2.3. Цикл while.
- •2.2.4. Цикл do while
- •Void main()
- •2.3. Операторы break и continue
- •Void main()
- •Void main()
- •2.4. Типичные ошибки при использовании операторов цикла
- •Глава 3. Производные типы данных.
- •3.1. Ссылки и указатели.
- •Int test; // объявили целочисленную переменную
- •Int & s_test; // ошибка! ссылка не связана с переменной
- •Int *p1; // объявлен указатель на целое с именем p1
- •3.2. Массивы и строки.
- •Int z[10]; //массив из 10 целых чисел
- •Int ar[3]; // объявлен целочисленный массив из 3 элементов
- •Int varr[4]; // объявление массива
- •3.2.2. Многомерные массивы.
- •Int z[3][4]; //массив из 12 целых чисел
- •3.2.3. Строки
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •If(strstr(st,st2)) //если подстрока встречается, выводим
- •3.1.5. Динамическое определение одномерных массивов.
- •3.1.6. Динамические двумерные массивы.
- •3.1.7. Указатели, массивы и арифметика указателей.
- •Int tacs[3];
- •Void main()
- •3.2. Структуры
- •Int age; // элементы структуры
- •Int hours;
- •Int mins;
- •Void main()
- •Int hours;
- •Int mins;
- •Void main()
- •4. Функции, определяемые пользователем
- •4.1. Объявление и определение функции
- •Int max(int , int ); // в прототипе достаточно указать только тип и
- •Void main() {
- •Int MyRand(){
- •Int func(){ return 1;} // правильное выражение
- •Int func2(){return 0.146;} // неправильно, 0.146 преобразуется к int с
- •Void swap(int p, int q)
- •Int bigger(int a,int b)
- •4.2. Передача параметров функций
- •5. Заголовочные файлы.
- •6. Работа с файлами
- •6.1 Простой файловый ввод/вывод
- •6.2 Тонкости работы с файлами
- •7.1. Определение классов.
- •Void main()
- •7.2. Как объявлять функции класса?
- •7.3. Конструкторы и деструкторы классов.
- •8. Графика OpenGl.
- •Void callback Draw()
- •Void main()
- •8.1. Создание анимации с помощью библиотеки xgl
- •Приложения Управление выводом
- •Управление шириной вывода
3.1.6. Динамические двумерные массивы.
В динамической области памяти можно создавать и многомерные массивы. Наиболее часто это приходитcя делать с двумерными массивами. Выше уже отмечалось «родство» одномерных массивов и указателей. В С++ двумерный массив можно интерпретировать как указатель на указатель. Ниже приводится фрагмент кода, с помощью которого выделяется память под массив из nrow строк и ncol столбцов:
int n=5;
int *a=new int[10]; // создаем одномерный массив а[10]
int nrow=7,ncol=10;
int **mass =new int *[nrow]; //массив указателей mass[nrow]
for (int i=0;i<nrow;i++)
// элементу массива указателей присваивается участок памяти под
// строку двумерного массива:
mass[i]=new int [ncol];
// созданный двумерный массив далее можно использовать обычным образом
mass[1][2] = 13;
//Последовательное уничтожение двумерного массива…
for (i = 0; i < nrow; i++)
delete[] mass[i];
delete[] mass;
3.1.7. Указатели, массивы и арифметика указателей.
Уже отмечалось, что имя массива является указателем на первый (нулевой) элемент массива. Следующий пример иллюстрирует это утверждение:
Int tacs[3];
tacs[0] = 43; // присваиваем значение нулевому элементу
*tacs = 2; // или так присваиваем новое значение нулевому элементу
*(tacs + 1) = 4; // присваиваем значение первому элементу
По видимому, нет необходимости обращаться к i-му элементу массива, используя выражение *(tacs + i) , а не tasc[i]. Однако знать о такой возможности следует.
Такой же принцип доступа к элементам массива сохраняется и для многомерных массивов. Так, доступ к элементу двумерного массива можно получить обычным способом: mass[i][j], а можно так: *(mass[i] + j) или *(* (mass +i)+j).
С++ позволяет решать одну и ту же задачу разными способами, иногда экзотичными. Старайтесь использовать наиболее простые для понимания решения.
С указателями можно выполнять следующие операции: разыменования (*), присваивания, сложение с константой, вычитание указателей, инкремента (++), декремента (--), приведения типов.
Из приведенного выше примера можно понять, что операция инкремента перемещает указатель к следующему элементу массива, а декремента – к предыдущему. Само значение указателя изменяется на величину, соответствующего типа, выраженного в байтах. Например,
int *pint = new int [3]; // выделена память под массив из трех элементов
p++; // значение увеличивается на 4
Разность двух указателей дает число, равное разности адресов, деленное на размер типа, выраженное в байтах. Не допускается сложение указателей.
При использовании нескольких операций, следует помнить об их приоритете. Так выражение
*pint++ = 12;
следует понимать так
*pint = 12; pint++; // по адресу связанному с pint пишется значение 12
// затем значение pint увеличивается
Операции разыменования и инкремента имеют одинаковый приоритет, поэтому первой выполняется операция, которая расположена левее, но присваивание имеет более высокий приоритет, чем постфиксный инкремент и выполняется первым. Обычный порядок выполнения операций можно изменить при помощи круглых скобок.
(*pint)++; // значение по адресу pint увеличивается на единицу &&&&
Следующий фрагмент кода копирует элементы массива в другой массив1. Из возможных способов выбран тот, который иллюстрирует особенности арифметики указателей:
int a [100], b[100];
int *pa = a; // или int *pa = &a[0];
int *pb = b;
for (int i=0;i<100; i++)
*pb++ = *pa++; // или b[i]=a[i];
Контрольные вопросы и задания.
1. Почему в приведенной ниже программе значение элемента массива p[2] становится неопределнным? Почему p[0] становится равным 2?
#include <iostream.h>