Студопедия

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

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

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






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






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

Указатель объявляется следующим образом:

тип *идентификатор;

Примеры описаний указателей:

int *pti; char *ptc; float *ptf;

После такого описания переменная pti может принимать значение указателя на величину целого типа; переменная ptc предназначена для хранения указателя на величину типа char; переменная ptf – на величину типа float.

С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес» операнда (т.е. установить указатель на операнд). Данная операция допустима только над переменными. Операция * имеет смысл: «значение, расположенное по указанному адресу» и работает следующим образом:

- определяется местоположение в оперативной памяти переменной типа указатель.

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

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

Пример 1:

int x, /* переменная типа int */

*y; /* указатель на элемент данных типа int */

y=& x; /* y - адрес переменной x */

*y=1; /* косвенная адресация указателем поля x

“по указанному адресу записать 1”, т.е. x=1; */

Пример 2:

int i, j=8, k=5, *y;

y=& i;

*y=2; /* i=2 */

y=& j; /* переустановили указатель на переменную j */

*y+=i; /* j+=i, т.е. j=j+1 -> j=j+2=10 */

y=& k; /*переустановили указатель на переменную k */

k+=*y; /* k+=k, k=k+k = 10 */

(*y)++; /* k++, k=k+1 = 10+1 = 11 */

Указателю-переменной можно присвоить значение другого указателя либо выражения типа указатель с использованием, при необходимости операции приведения типа (приведение необязательно, если один из указателей имеет тип " void *").

int i, *x;

char *y;

x=& i; /* x -> поле объекта int */

y=(char *)x; /* y -> поле объекта char */

y=(char *)& i; /* y -> поле объекта char */

Рассмотрим фрагмент программы:

int a=5, *p, *p1, *p2;

p=& a; p2=p1=p;

++p1; p2+=2;

printf(“a=%d, p=%d, p=%p, p1=%p, p2=%p.\n”, a, p, p, p1, p2);

Результат выполнения:

a=5, *p=5, p=FFC8, p1=FFCC, p2=FFD0.

Конкретные значения адресов зависят от ряда причин: архитектура компьютера, тип и размер оперативной памяти и т.д.

Операции над указателями (адресная арифметика)

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

Например, int *pti; char *ptc; float *ptf;

Выполнение операторов pti=pti+1; или pti++; изменит значение указателя pti на 2, в результате чего он примет значение FFC2. В результате выполнения оператора pti--; значение указателя уменьшится на 2 и станет равным FFBE.

Аналогично для указателей других типов:

ptc++; увеличит значение указателя на 1;

ptf++; увеличит значение указателя на 4.

Разрешается сравнивать указатели и вычислять разность двух указателей. При сравнении могут проверяться отношения любого вида (" > ", " > =", " < ", " < =", " ==", "! ="). Наиболее важными видами проверок являются отношения равенства или неравенства.

В заголовочном файле stdio.h определена константа – нулевой указатель с именем NULL. Ее значение можно присваивать указателю. Например: ptf=NULL;

Нулевой указатель обозначает отсутствие конкретного адреса ссылки.

Пример. Ввести два целых числа. Вычислить сумму, разность и деление этих чисел.

#include< stdio.h>

#include< stdio.h>

void main()

{ int a, b, *p1, *p2, *p3;

float *p4;

clrscr();

puts(“Введите 2 целых числа”);

scanf (“%d%d”, a, b);

*p1=a+b;

*p2=a*b;

*p3=a-b;

*p4=(float)a/b;

printf (“%d + %d=%d\n”, a, b, *p1);

printf (“%d * %d=%d\n”, a, b, *p2);

printf (“%d - %d=%d\n”, a, b, *p3);

printf (“%d / %d=%f\n”, a, b, *p4);

getch();

}






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