Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Указатели и Массивы

Зачем нужны указатели?

Применение указателей позволяет упростить алгоритм или повысить его эффективность. Каким образом? Указатели могут обесечить простые способы ссылок на массивы, списки или блоки данных. Для таких ссылок достаточно иметь простой элемент данных: указатель. Нередко бывает проще и эффективнее манипулировать простым указателем, чем управлять полным списком данных. Управление памятью компьютера - это еще одно из важнейших применений указателей.

 

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

Объявление int a[10]; определяет массив а размера 10, т.е. блок из 10 последовательных объектов с именами а[0], a[1],..., a[9].

Запись a[i] отсылает нас к i-му элементу массива. Если pa есть указатель на int, т.е. определен как int *pa; то в результате присваивания pa=&a[0]; pa будет указывать на нулевой элемент а; иначе говоря, ра будет содержать адрес элемента а[0].

Теперь присваивание x=*pa;

будет копировать содержимое a[0] в х. Если ра указывает на некоторый элемент массива, то ра+1 по определению указывает на следующий элемент, ра+i - на i-ый элемент после ра, а ра-i - на i-ый элемент перед ра. Таким образом, если ра указывает на а[0], то *(ра+1) есть содержимое а[1], pa+i - адрес а[i], a *(pa+i) - содержимое a[i].

Сделанные замечания верны к типу и размеру элементов массива а. Смысл слов "добавить 1 к указателю", как и смысл любой арифметики с указателями, в том, чтобы ра+1 указывал на следующий объект, а ра+i - на i-й после ра.

Между индексированием и арифметикой с указателями существует очень тесная связь. По определению имя масива - это адрес его нулевого элемента. После присваивания

pa=&a[0];

pa и а имеют одно и то же значение. Поскольку имя массива есть не что иное, как адрес его начального элемента, присваивание ра=&a[0]; можно также записать в следующем виде:

ра=a;

Еще более удивительно (по крайней мере на первый взгляд) то, что а[i] можно записать как *(a+i). Встречая запись a[i], компилятор сразу преобразует ее в * (а+i); указанные две формы записи эквивалентны. Из этого следует, что полученные в результате применения, оператора & записи &a[i] и a+i также будут эквивалентны, т.е. и в том и в другом случае это адрес i-го элемента после а. С другой стороны, если ра - указатель, то в выражениях его можно использовать с индексом, т.е. запись ра[i] эквивалентна записи *(ра+i). Элемент массива одинаково разрешается изображать и в виде указателя со смещением, и в виде имени массива с индексом.

Между именем массива и указателем, выступающим в роли имени массива, существует одно различие. Указатель - это переменная, поэтому можно написать ра=а или ра++. Но имя массива является константой, и записи типа а=ра или а++ не допускаются.

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

 

#include <iostream.h>void main(){ const int ArraySize=10; //объявили константу для задания размерности массива int A[ArraySize], *p, i; //объявили: массив A из ArraySize элементов типа int; указатель p на int; //переменную i типа int p=A; /*указателю p присвоили адрес нулевого элемента массива (вспомним, имя массива содержит адрес его нулевого элемента)*/ for (i=0; i<ArraySize; i++) { cout<<"Do enter A["<<i<<"] element -->";cin>>p[i]; //p[i] - можно заменить на: *(p+i), *(A+i) или на привычное нам A[i] } int min=*p, index=0; for (i=1;i<ArraySize;i++) if (min>*(p+i)) {min=*(p+i); //*(p+i) - можно заменить на: p[i], *(A+i) или на привычное нам A[i]index=i; } cout<<" Minimum was found! Value = "<<min<<" Index ="<<index<<endl; //Вывели на экран результаты работы нашей программы}

 

<== предыдущая лекция | следующая лекция ==>
Как работать с указателями? | Пример 3. А теперь - практика!!! Как всегда, будьте особо внимательны при анализе примеров
Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 400; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.