Студопедия — Указатели и массивы.
Студопедия Главная Случайная страница Обратная связь

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

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






В языка С между указателями и массивами существует тесная связь. Имя массива – это не что иное, как указатель на первый элемент массива – элемент с индексом 0. когда объявляется массив в виде int array[25], то компилятор не только выделяет память для 25 элементов массива типа int, но и создает указатель с именем array, который ссылается на первый по счету элемент массива (с нулевым индексом). Сам массив остается безымянным, а доступ к элементам массива осуществляется через указатель с именем array. Следует отметить, что указатель array является константным, значение которого можно использовать в выражениях, но изменить нельзя.

Пример 10. имя массива можно приравнять указателю, т.к. оно также является указателем.

int array[25];

int *ptr;

ptr=array;

Здесь указатель ptr устанавливается на начало массива array, причем присваивание ptr= array можно записать в эквивалентной форме: ptr=& array[0].

Для доступа к элементам массива существует два различных способа.

Первый способ связан с использованием обычных индексных выражений в [ ], например, инструкция array[10]=35 записывает константу 35 в элемент с индексом 10, а инструкция array[i+4]=rev записывает значение переменной rev в (i+4)-й элемент массива array.

Второй способ доступа к элементам массива связан с применением указателей:

*(array+10)=35;

*(array+i+4) = 7.

Рассматривая имя массива как указатель, мы проделали те же действия, что и в предыдущем примере. Операция * в данном случае – это «разыменование» или обращение к объекту через указатель.

Подобным же образом можно обращаться к элементам массива с помощью независимого (переменного) указателя.

Пример 11. Сравнение двух способов доступа к элементам массива.

// определение массива mas и указателя q

char mas[100], q;

//инициализация указателя – установка на нулевой элемент массива

q=mas;

//доступ к элементам массива (следующие записи эквивалентны)

mas[0]; //*q

mas [10]; //*(q+10)

mas[n-1]; //*(q+n-1)

 

Использование индексации для доступа к массиву более наглядно, но использование указателя более эффективно. При индексировании элемента массива его адрес каждый раз вычисляется по начальному адресу (имени массива) и смещению (индексу), что снижает эффективность полезных вычислений. Поскольку быстродействие программы – одно из важнейших ее свойств, предпочтительнее использовать указатели-переменные.

Пример 12. Обработка элементов массива.

char s[20]; //определение массива типа char

//определение и установка указателя на 0-й элемента массива

char *p=&s[0]; //аналог *p=s;

*(p+10)=’m’; //записываем символ ‘m’ в 10-й элемент

р++; //установка указателя на 1-ый элемент

*(р+10)=’k’; //меняем значение 11-го элемента

if (*(p-1)!= ‘\n’) //проверка 0-го элемента

В примере массив и указатель имеют тип char (размер элемента 1 байт). Прибавляем к адресу 1, мы сдвигаемся на один байт. А как быть, если мы работаем, например, с типом int, у которого размер 4 байта? Оказывается, что и в этом случае все показанные выше арифметические операции с указателями дадут правильный результат. Разумеется, к адресу будет добавляться не 1, а 4, но нам об этом даже не придется думать.

Пример 13.

int s[20]; //определение массива типа int

//определение и установка указателя на 0-й элемента массива

int *p=&s[0]; //аналог *p=s;

*(p+10)=1; //записываем 1 в 10-й элемент

р++; //установка указателя на 1-ый элемент

*(р+10)=2; //меняем значение 11-го элемента

if (*(p-1)!= 10) //проверка 0-го элемента

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

 

Пример 14. вывести на экран элементы массива и их адреса

#include <stdio.h>

void main()

{

char s[] =”string”, *p; //работа с массивом типа char

for (p=s; *p!=0; p++) //p+1 в абсолютных значениях

printf(“s: %c \t p = %p\n”, *p, p);

int q[] ={10, 20, 30, 40, 50, 0}, *p1; //работа с массивом типа int

for (p1=q; *p1!=0; p1++) //p1+4 в абсолютных значениях

printf(“q[0]= %d \t p1 = %p \n”, *p1, p1);

}

 

Для вывода значения указателя (адреса элемента массива) на экран дисплея в функции printf() используется спецификатор формата %р (тип указатель).

Итак, мы разобрали одно из назначений указателей – обращение к элементам массивов (или других сложных типов данных).

Другое, не менее важное применение указателей – передача параметров и возврат значений из функций.

 







Дата добавления: 2015-08-12; просмотров: 347. Нарушение авторских прав; Мы поможем в написании вашей работы!



Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Виды сухожильных швов После выделения культи сухожилия и эвакуации гематомы приступают к восстановлению целостности сухожилия...

КОНСТРУКЦИЯ КОЛЕСНОЙ ПАРЫ ВАГОНА Тип колёсной пары определяется типом оси и диаметром колес. Согласно ГОСТ 4835-2006* устанавливаются типы колесных пар для грузовых вагонов с осями РУ1Ш и РВ2Ш и колесами диаметром по кругу катания 957 мм. Номинальный диаметр колеса – 950 мм...

Философские школы эпохи эллинизма (неоплатонизм, эпикуреизм, стоицизм, скептицизм). Эпоха эллинизма со времени походов Александра Македонского, в результате которых была образована гигантская империя от Индии на востоке до Греции и Македонии на западе...

Сравнительно-исторический метод в языкознании сравнительно-исторический метод в языкознании является одним из основных и представляет собой совокупность приёмов...

Концептуальные модели труда учителя В отечественной литературе существует несколько подходов к пониманию профессиональной деятельности учителя, которые, дополняя друг друга, расширяют психологическое представление об эффективности профессионального труда учителя...

Конституционно-правовые нормы, их особенности и виды Характеристика отрасли права немыслима без уяснения особенностей составляющих ее норм...

Studopedia.info - Студопедия - 2014-2024 год . (0.011 сек.) русская версия | украинская версия