Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Примеры программ. Пример 1. Программа, демонстрирующая работу с указателями и ссылками.
Пример 1. Программа, демонстрирующая работу с указателями и ссылками.
#include " stdafx.h" #include < iostream> #include < stdio.h>
using namespace std;
void main() { setlocale(LC_ALL, " Russian");
int a = 1, b; int *x, *y = & b; // b = 3; x = & a; int *z = new int(5); int & k = b;
printf(" +-------+---+---+--------+--------+---+---+---+--------+--------+---+--------+\n"); printf(" | cmd | a |*x | & a | x | b |k |*y | & b | y |*z | z |\n"); printf(" +-------+---+---+--------+--------+---+---+---+--------+--------+---+--------+\n"); printf(" | | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//увеличим значение ячейки памяти на которую указывает x, (т.е. переменную b), при этом поменяется и b (*x)++; printf(" |(*x)++ | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//присвоим b знаяени -1, при этом поменяется и *x b = 7; printf(" |b = 7 | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//скопируем значение ячейки памяти на которую указывает z в ячейку на которую указывает y *y = *z; printf(" |*y = *z| %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//тепеь x указывает туда же, куда и y, т.е. на b, значение *x поменялось x = y; printf(" |x = y | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//изменим значение a, другие значения не изменились, так как x на a больше никто не указывает a *= 3; printf(" |a *= 3 | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//поменялись значения указателей, которые указывали на b и сама b *x = 9; printf(" |*x = 9 | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//теперь x указывает туда же, куда и z, т.е. на переменную в динамической памяти, //значение *y поменялось и адрес y тоже y = z; printf(" |y = z | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//изменим значение b через ссылку k k = 7; printf(" |k = 7 | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//изменим значение b через ссылку k k -= 3; printf(" |k -= 3 | %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
//изменим значение z *z += 3; printf(" |*z += 3| %1d | %1d | %6X | %6X | %1d | %1d | %1d | %6X | %6X | %1d | %6X |\n", a, *x, & a, x, b, k, *y, & b, y, *z, z);
printf(" +-------+---+---+--------+--------+---+---+---+--------+--------+---+--------+\n");
delete z; }
Результаты работы программы:
+-------+---+---+--------+--------+---+---+---+--------+--------+---+--------+ | cmd | a |*x | & a | x | b |k |*y | & b | y |*z | z | +-------+---+---+--------+--------+---+---+---+--------+--------+---+--------+ | | 1 | 1 | 12FF60 | 12FF60 | 3 | 3 | 3 | 12FF54 | 12FF54 | 5 | 3159C0 | |(*x)++ | 2 | 2 | 12FF60 | 12FF60 | 3 | 3 | 3 | 12FF54 | 12FF54 | 5 | 3159C0 | |b = 7 | 2 | 2 | 12FF60 | 12FF60 | 7 | 7 | 7 | 12FF54 | 12FF54 | 5 | 3159C0 | |*y = *z| 2 | 2 | 12FF60 | 12FF60 | 5 | 5 | 5 | 12FF54 | 12FF54 | 5 | 3159C0 | |x = y | 2 | 5 | 12FF60 | 12FF54 | 5 | 5 | 5 | 12FF54 | 12FF54 | 5 | 3159C0 | |a *= 3 | 6 | 5 | 12FF60 | 12FF54 | 5 | 5 | 5 | 12FF54 | 12FF54 | 5 | 3159C0 | |*x = 9 | 6 | 9 | 12FF60 | 12FF54 | 9 | 9 | 9 | 12FF54 | 12FF54 | 5 | 3159C0 | |y = z | 6 | 9 | 12FF60 | 12FF54 | 9 | 9 | 5 | 12FF54 | 3159C0 | 5 | 3159C0 | |k = 7 | 6 | 7 | 12FF60 | 12FF54 | 7 | 7 | 5 | 12FF54 | 3159C0 | 5 | 3159C0 | |k -= 3 | 6 | 4 | 12FF60 | 12FF54 | 4 | 4 | 5 | 12FF54 | 3159C0 | 5 | 3159C0 | |*z += 3| 6 | 4 | 12FF60 | 12FF54 | 4 | 4 | 8 | 12FF54 | 3159C0 | 8 | 3159C0 | +-------+---+---+--------+--------+---+---+---+--------+--------+---+--------+
Пример 2. Найти сумму элементов в динамическом массиве. Размерность массива ввести с клавиатуры. Использовать различные варианты при обращении к массиву.
#include " stdafx.h" #include < iostream>
using namespace std;
void main() { setlocale(LC_ALL, " Russian");
//введем размерность массива int N; cout < < " Введите размерность массива: "; cin > > N;
//создаем массив динамически int *a = new int[N];
//введем элементы массива с клавиатуры for (int i = 0; i < N; i++) { cout < < " Введите " < < i < < " -й элемент массива: "; cin > > a[i]; }
//объявим переменную для хранения суммы элементов int s = 0;
//просуммируем элементы массива for (int i = 0; i < N; i++) s += *(a + i);
//выведем на экран элементы массива и их сумму cout < < " a: "; for (int i = 0; i < N; i++) cout < < " " < < i[a];
cout < < endl < < " Сумма элементов: " < < s < < endl;
//очищаем выделенную памать delete[] a; }
Контрольные вопросы 1. Что такое указатель? 2. Как определить указатель? 3. Как проинициализировать указатель? 4. Какие способы инициализации указателей вы знаете? 5. Как обратиться к переменной, адресуемой указателем? 6. Как получить адрес объекта? 7. Какие операции можно выполнять над указателями? 8. Что такое ссылка? 9. Как объявить ссылку? 10. Как создать переменную в динамической памяти? 11. Как удалить переменную из динамической памяти? 12. На что следует обращать особое внимание при работе с динамической памятью? 13. Какие способы обращения к элементам массива вы знаете? 14. Что такое динамический массив и для чего они применяются? 15. Как создать динамический массив?
|