Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к информатике.doc
Скачиваний:
9
Добавлен:
26.09.2019
Размер:
356.86 Кб
Скачать
  1. Указатели. Типизированные и нетипизированные.

Указатель – это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера. Подобно тому, как переменная типа char имеет в качестве значения символ, а переменная типа int – целочисленное значение, переменная типа указателя имеет в качестве значения адрес ячейки оперативной памяти. Допустимые значения для переменной-указателя – множество адресов оперативной памяти компьютера.

Указатель является одной из наиболее важных концепций языка C.

Правильное понимание и использование указателей особенно необходимо для составления хороших программ по следующим причинам:

·     указатели являются средством, при помощи которого функции могут изменять значения передаваемых в нее аргументов;

·     при помощи указателей выполняется динамическое распределение памяти;

·     указатели позволяют повысить эффективность программирования;

·     указатели обеспечивают поддержку динамических структур данных (двоичные деревья, связные списки).

Однако указатель может вызвать и ряд затруднений, например, если указатель содержит неправильное значение, программа может быть неработоспособной. Можно легко ошибиться при использовании указателей; к тому же ошибки, связанные с неправильными значениями указателей, найти очень трудно.

Итак, указатель – это новый тип данных. Для него определены понятия константы, переменной, массива. Как и любую переменную, указатель необходимо объявить. Объявление указателя состоит из имени базового типа, символа * (звездочка) и имени переменной.

Общая форма объявления указателя:

тип *имя;

Тип указателя определяет тип объекта, на который указатель будет ссылаться, например,

int *p1;

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

Типизированные указатели

char *c; // указатель на char

int *i, j; // указатель на int

i=&j; // i присвоить адрес j

*i=1; // разыменованный указатель j=1

* - операция косвенной адресации

& - операция получения адреса

Указатели

void *p; // нетипизированный указатель

float *pf, f; // типизированный указатель

pf=&f; // pf присвоить адрес f

p=pf; // одному указателю присвоить значение другого

pf=(float *) p; // явное указание типа при разыменовании

Пример: вычисление суммы квадратов первых 100 натуральных чисел:

int *ptr;

long *sum;

*sum = 0;

for (*ptr = 1; *ptr <= 100; (*ptr)++)

*sum = *sum + (*ptr)*(*ptr);

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

var <имя_указателя>: ^<тип_адресуемой_переменой>;

Например:

var p: ^integer;

q: ^real;

s: ^array[1..10] of byte;

Кроме того, существуют универсальные нетипизированные указатели, которые могут хранить адрес переменной любого типа:

var <имя_указателя>: pointer;