Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Указатели и одномерные массивы






Указатель – это переменная, которая содержит адрес переменной. Так как указатель – это адрес некоторого объекта, то через него можно обращаться к данному объекту.

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

Декларация

int a[10];

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

 
 

Запись a[i] отсылает нас к i-му элементу массива. Если ра есть указатель, т.е. определен как

int *pa;, то в результате присваивания

pa = & a[0];

pa будет указывать на нулевой элемент массива а; иначе говоря, ра будет содержать адрес элемента a[0] (см. рис.). Теперь присваивание

x=*pa;

будет копировать содержимое а[0] в х.

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

Поскольку имя массива есть не что иное как адрес его начального элемента, присваивание

pa=& a[0];

можно также записать в следующем виде:

pa = a;

Так как ра – указатель, то в выражениях его можно использовать с индексом, то есть запись pa[i] эквивалентна записи *(pa+i). Элемент массива одинаково разрешается изображать и в виде указателя со смещением, и в виде имени массива с индексом.

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

Следует также различать выражения *(a+2) и *a+2:

*(а+2) – значение третьего элемента массива а;

*а+2 – добавление числа 2 к значению первого элемента массива.

 

Пример 4.1. Вывести значения одномерного массива обычным способом и с использованием указателей.

Фрагмент программы:

/*объявление и инициализация массива*/

int a[6]={10, 20, 30, 40, 50, 60};

int i, *p;

/*вывод массива обычным способом*/

for (i=0; i< 6; i++)

Label1-> Caption=Label1-> Caption+IntToStr(a[i])+" ";

p=a;

/*вывод массива с использованием указателя*/

for (p=& a[0]; p< =& a[5]; p++)

Label2-> Caption=Label2-> Caption+IntToStr(*p)+" ";

/*еще один вариант с использованием указателя*/

for (p=& a[0], i=0; i< 6; i++)

Label3-> Caption=Label3-> Caption+IntToStr(p[i])+" ";

Дадим еще некоторые пояснения. Операция р++ увеличивает значение указателя на единицу. Если p=& a[i], то после операции р++ в р содержится адрес элемента a[i+1].

Пример 4.2. Найти среднее арифметическое массива, состоящего из шести элементов, с использованием указателя.

int a[6]={10, 20, 30, 40, 50, 60};

int i, *p;

float s;

p=a; /*указатель получает значение адреса нулевого элемента массива*/

for (s=0, i=0; i< 6; i++)

s+=*(p+i); /*получение суммы элементов массива*/

s=s/6; /*среднее арифметическое массива*/

Label1-> Caption=Label1-> Caption+FloatToStr(s)+" ";

Пример 4.3. Задан одномерный массив S, состоящий из десяти элементов вещественного типа. Вывести значения элементов этого массива в обратном порядке.

Операция р++ увеличивает значение указателя на единицу. Если p=& a[i], то после операции р++ в р содержится адрес элемента a[i+1].

 

{int s[10];

int *p, i;

randomize();

/*заполнение массива случайными числами*/

for (i=0; i< 10; i++)

StringGrid1-> Cells[i][0]=IntToStr(rand () % 99 - 25);

/*вывод элементов массива*/

for (i=0; i< 10; i++)

s[i]=StrToInt(StringGrid1-> Cells[i][0]);

p=& s[9]; /*указатель получает значение адреса последнего элемента массива*/

/*вывод элементов в обратном порядке*/

for (i=0; i< 10; i++)

StringGrid2-> Cells[i][0]=*(p-i);

/* вывод элементов в обратном порядке другим способом */

for (i=0, p=& s[9]; p> =& s[0]; p--, i++)

StringGrid3-> Cells[i][0]= *p;

}

Пример 4.4. Вывести на экран значения нулевого, второго и четвертого элементов массива.

{ /*объявление и инициализация массива а*/

int a[]={10, 20, 30, 40, 50, 60};

int *p, i;

/*вывод значений нулевого, второго и четвертого элементов*/

for (p=a, i=0; p+i< =a+4; p++, i++)

Label1-> Caption= Label1-> Caption + *(p+i) + " "; }

В цикле происходит одновременное увеличение указателя р и индекса i на единицу, вследствие чего на экран после нулевого элемента выводится второй, и затем четвертый.

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.