Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Указатели

Указатель – это переменная, значением которой является адрес, по которому располагаются данные. Адрес – это номер ячейки памяти, в которой или с которой располагаются данные.

Классифицировать указатели можно:

• по типу данных (типизированные и не типизированные указатели);

• по области доступа (ближние и дальние указатели).

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

Не типизированный указатель – указатель, содержащий адрес данных неопределенного типа (просто адрес).

Ближний указатель – указатель, содержащий только смещение, по которому располагаются данные. Сегмент в этом случае используется по умолчанию – текущий сегмент данных. Размер ближнего указателя в 16-разрядном реальном режиме работы процессора составляет 16 бит, а в 32-разрядном защищенном режиме – 32 бита.

Дальний указатель – указатель, содержащий и сегмент и смещение. Размер дальнего указателя в 16-разрядном реальном режиме работы процессора составляет 32 бита (16 бит – сегмент, 16 бит - смещение), а в 32-разрядном защищенном режиме – 48 бит (16 бит – селектор, 32 бита - смещение).

Работа с указателями в языке С включает три действия, осуществляемых в следующем порядке:

  • объявление указателя;
  • установка указателя;
  • обращение к значению, расположенному по указателю.

Объявление (описание) указателя в языке C имеет следующий вид:

тип [near|far] *имя [=значение];

В современной реализации языка C (стандарт C99), ориентированной под разработку программ для ОС Windows, вследствие используемой в ОС Windows модели памяти, используются исключительно ближние (near) указатели, поэтому при объявлении указателя (например, в среде разработки Pelles C) модификатор области доступа указывать не надо.

 

Указатель при объявлении можно инициализировать, указав через знак присвоения соответствующее значение. Данное значение должно быть адресом, записанном в одном из следующих виде:

• нулевое значение (идентификатор NULL);

• другой указатель;

• адрес переменной (через операцию взятия адреса);

• выражение, представляющее собой арифметику указателей;

• адрес, являющийся результатом выделения динамической памяти.

Операция взятия адреса – операция языка C, возвращающая адрес переменной. Данная операция имеет следующий синтаксис:

&имя_переменной

Например, в программе описаны следующие переменные:

int a,b;

double c;

Описание указателей на эти переменные с инициализацией будет иметь вид:

int *ptr_a = &a, *ptr_b = &b;

double *ptr_c1 = &c, *ptr_c2 = ptr_c1;

Пример объявления не типизированного указателя с инициализацией нулевым значением:

void *ptr = NULL;

Установка указателя - присвоение его значению адреса, по которому располагаются или будут располагаться данные.

Для установки указателя используется оператор присвоения, в левой части которого указывается имя указателя, а в правой – одно из значений отличных от NULL, используемых при инициализации указателя. Пример установки указателей:

int a = 10, *ptr = NULL;

ptr = &a;

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

*имя_указателя

Значение, полученное путем разыменования указателя, может рассматриваться в программе как LValue, так и RValue значение.

Например:

double x = 0.0, *ptr = NULL;

ptr = &x;

scanf("%lf”,ptr);

*ptr += 1.5;

printf("%lf\n”,*ptr);

В языке С можно создавать константные указатели – значение, расположенное по этому указателю нельзя изменить. Создание такого указателя имеет следующий синтаксис:

const тип *имя = инициализирующее значение;

Например, следующий фрагмент программы приведет к ошибке компиляции:

int a = 10;

const int *ptr = &a;

(*ptr)++;

Объявление указателя на массив имеет тот же синтаксис, что и объявление обычного указателя. Например, объявление указателя на вещественный массив типа double будет иметь вид:

double *arrptr = NULL;

Объявление целочисленного массива из десяти элементов с инициализацией нулевыми значениями, и объявление с инициализацией указателя на этот массив будут иметь вид:

int arr[10] = {0}, *arrptr = arr;

Фрагмент программы, в которой объявляется массив из 10 элементов целого типа, осуществляется ввод массива с вычислением суммы его элементов и вывод значения этой суммы с использованием указателей на массив и на переменную для хранения суммы:

int array[10] = {0}, summa = 0;

int *arrptr = array, *ptr = &summa;

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

scanf("%d”,&arrptr[i]);

*ptr += arrptr[i];

}

printf("Сумма: %d\n”,*ptr);

Довольно часто встречаются случаи, когда необходимо работать с массивами указателей. Синтаксис объявления массива указателей следующий:

тип *имя[размер];

Например: вычисление суммы набора целых чисел через обращение к ним посредством массива указателей на целые числа:

int arr[10], *ptrs[10], summa = 0;

for(int i=0;i<10;i++) ptrs[i] = &arr[i];

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

scanf("%d”,ptrs[i]);

summa+= *ptrs[i];

}

printf("Сумма: %d\n”,summa);

<== предыдущая лекция | следующая лекция ==>
Многомерные массивы | Введение. Современное состояние информационных ресурсов и информатизации общества
Поделиться с друзьями:


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


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



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




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