Основы программирования для автоматизированного проектирования и решения творческих задач. Романенко А.В - 18 стр.

UptoLike

Составители: 

В языке С указатели тесно связаны с базовыми типами данных. При организации доступа к памяти с помощью опера-
ции разыменования указателя компьютеру необходима информация не только о размещении, но и о размерах используемого
участка памяти. Эту информацию компьютер получает из базового типа указателя. В качестве типа может быть использован
как простой, так и сложный тип данных (массив, указатель, структура, объединение, созданный пользователем тип).
П р и м е р 10
#include <stdio.h>
void main()
{
long L = 0x12345678;
char *с = (char *) &L;
short *s = (short *) &L;
long *l = (long *) &L;
printf("*c = %x", (int) *c);
printf("\n*s = %x", *s);
printf("\n*l = %x", *l);
}
В результате работы этой программы на печать будут выведены следующие результаты:
*c =78
*s =5678
*l =12345678
Исключение составляет тип void (отсутствие значения). Указатель типа void * отличается от других указателей отсутст-
вием сведений о размере соответствующего ему участка памяти. При его использовании обязательно необходима операция
приведения типа.
П р и м е р 11
#include <stdio.h>
void main()
{
void *v;
int i = 10;
double d = 10.1;
v = &i;
printf("i = %d", *(int *) v);
v = &d;
printf("d = %g", *(double *) v);
}
Возможности связывания указателей типа void * с объектами разных типов называется "родовым программированием".
Разрешено неявное преобразование любого константного указателя к типу void *.
Поскольку с точки зрения компьютера указатель хранит такие же данные как и любая другая переменная, то к ним раз-
решается применять операции по преобразованию информации с учетом смысла указателя. Над указателями разрешается
выполнять следующие действия:
разыменование;
преобразование типов;
присваивание;
получение адреса;
аддитивное сложение и вычитание;
инкремент и декремент;
операции отношения.
Аддитивные операции могут применяться по отношению к указателю и константе и иногда к двум указателям.
Наиболее полно для указателей реализована операция вычитания, которая применима к указателям на объекты одного
типа или к указателю и целочисленной константе. Вычитая два указателя можно определить "расстояние" между двумя уча-
стками памяти в единицах, кратных длине в байтах объекта того типа, к которому отнесен указатель. Вычитая из указателя
целочисленную константу k, можно переместиться к другой ячейке памяти на расстояние, равное в байтах
k * sizeof(тип).
Операция сложения относительно указателей реализована в языке С беднее: можно складывать указатель и целочис-
ленную константу k. При этом происходит перемещение к ячейке памяти, отстоящей от исходной на расстояние, равное в
байтах
k * sizeof(тип).