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

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

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






В языка С между указателями и массивами существует тесная связь. Имя массива – это не что иное, как указатель на первый элемент массива – элемент с индексом 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; просмотров: 350. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Примеры задач для самостоятельного решения. 1.Спрос и предложение на обеды в студенческой столовой описываются уравнениями: QD = 2400 – 100P; QS = 1000 + 250P   1.Спрос и предложение на обеды в студенческой столовой описываются уравнениями: QD = 2400 – 100P; QS = 1000 + 250P...

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

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

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

Тактические действия нарядов полиции по предупреждению и пресечению групповых нарушений общественного порядка и массовых беспорядков В целях предупреждения разрастания групповых нарушений общественного порядка (далееГНОП) в массовые беспорядки подразделения (наряды) полиции осуществляют следующие мероприятия...

Механизм действия гормонов а) Цитозольный механизм действия гормонов. По цитозольному механизму действуют гормоны 1 группы...

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