Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Краткие теоретические сведения. Указатель – это переменная, которая может содержать адрес некоторого объекта в памяти компьютера, например адрес другой переменной
Указатель – это переменная, которая может содержать адрес некоторого объекта в памяти компьютера, например адрес другой переменной. И через указатель, установленный на переменную можно обращаться к участку оперативной памяти, отведенной компилятором под ее значения. Указатель объявляется следующим образом: тип *идентификатор; Примеры описаний указателей: 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(); }
|