Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_Раб_5С++.doc
Скачиваний:
5
Добавлен:
02.09.2019
Размер:
169.98 Кб
Скачать

1.2 Указатели

В языке C++ для создания и обработки массивов обычно используют указатели. Указатель это переменная, содержащая адрес другой переменной или, говоря другими словами, указатель символическое представление адреса.

В С++ указатели могут быть на любой тип данных. Значением объекта типа указатель является целое неотрицательное число, равное адресу того программного объекта (переменной, функции, массива и т.д.), на который ссылается указатель.

Если необходимо, можно описать массив указателей:

int *ip[ 10 ]; массив указателей на целые значения из 10 элементов.

Напомним, что в данном контексте символ "*" является символом унарной операции косвенной адресации. Унарная операция * рассматривает свой операнд как адрес объекта и обращается по этому адресу, чтобы извлечь его содержимое.

Приведем еще один пример описания массива:

int (*a)[15];

Описан указатель на массив, содержащий 15 целых значений. Круглые скобки здесь необходимы, поскольку скобки [] имеют более высокий уровень старшинства, чем операция *.

Запись &pooh[3] означает указатель на элемент с индексом 3 массива pooh. Скобки [] имеют более высокий уровень старшинства, чем операция &. Операция & применима только к переменным!

С указателем можно производить некоторые арифметические операции. Например, пусть sub содержит номер элемента массива, тогда до этого элемента можно "добраться" следующим образом:

mas [ sub ] или *(mas +sub)

Таким образом, имя массива фактически является указателем на нулевой элемент массива. Переменная sub указывает на сколько элементов необходимо сместиться. Вы можете инкрементировать и декрементировать указатель. При этом вы смещаетесь на один элемент, независимо от типа элемента.

Допустим uk - адрес нулевого элемента массива, тогда

cout<<*uk; // вывод значения 0-го элемента

uk++;

cout<<*uk; // вывод значения 1-го элемента, реально смещение на несколько байтов

uk+=2

cout<<*uk; // вывод значения 3-го элемента.

Имя массива определяет также адрес его первого элемента, т.е. если nise[] является массивом, то nise==&nise[0] и обе части равенства определяют адрес первого элемента массива. Оба обозначения являются константами типа указатель, поскольку они не изменяются на протяжении всей программы. Однако их можно присваивать переменной типа указатель и изменять значение переменной, как показано в следующем примере.

Пример.

#include<iostream.h>

#include <conio.h>

int nise[4] = { 1,2,3,4 };

main () {

int *pr;

pr = nise; /* Вот присваивание переменной pr значения nise */

pr += 1; cout << "Адрес = " << pr << ", значение = " << *pr << endl;

pr += 2; cout << "Адрес = " << pr << ", значение = " << *pr << endl;

getch();

}

1.3 Типовые алгоритмы обработки массивов данных.

1.3.1 Нахождение суммы элементов массива

Для нахождения суммы элементов массива используется следующий алгоритм. Сначала предполагается, что значение искомой суммы равно нулю. Далее на каждом шаге цикла проводится накопление данной суммы путем добавления к уже имеющемуся значению суммы значения очередного элемента массива. Если суммирование проводится не по всем элементам массива, то в программу добавляется условный оператор проверки выполнения наложенного на элементы массива условия.

Без использования указателей

С использованием указателей

#include<iostream.h>

#include <conio.h>

main () {

int i, a[20];

int s=0;

for (i=0; i<20; i++) {

cout<<"Введите очередной элемент массива";

cin >> a[i];

s = s +a[i];

}

cout << "Сумма = " << s;

getch();

}

#include<iostream.h>

#include <conio.h>

main () {

int i, a[20], *ukazatel = &a[0];

int s=0;

for (i=0; i<20; i++) {

cout<<"\n Введите очередной элемент массива";

cin >> *(ukazatel+i);

s = s + *(ukazatel+i);

}

cout << "Сумма = " << s;

getch();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]