Среда, 08.01.2025, 20:13
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0
Реклама
Главная » Статьи » c++

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

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

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

Объявление 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<<"\n\nMinimum was found!\nValue = "<<min<<"\nIndex ="<<index<<endl;
 //Вывели на экран результаты работы нашей программы
}
Категория: c++ | Добавил: slava (30.04.2011)
Просмотров: 5577 | Рейтинг: 4.5/4
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]