Вычитание – допускается применять операцию вычитания для двух указателей одного типа. Результатом является количество объектов базового типа указателей, которые могли бы располагаться между адресами, определяемыми указателями.
#include <stdio.h>
void main( )
{
int x,y;
long int z;
int k;
int *pi1, *pi2;
long int *pli;
pi1=&x; pi2=&y;
printf (“%d\n”, pi2-pi1); // -1
pi2=&k;
printf (“%d\n”,pi2-pi1); // -4
pli=&z;
printf(“%d %d\n”,(int)pi2,int(pli)); // -20 -18
printf(“%d\n”,(long int*)pi2-pi1);//
pi2=&y (“%d\n”,(longint*)pi2-pi1); //1
printf(“%d\n”,pi2-(int*)pli); //2
printf(“%d\n”,(longint*)pi2-pli); //
}
В языке Си адрес программного объекта может хранить также ссылочные переменные, которая объявляется следующим образом:
тип &имя_ссылки = имя_программного_объекта
Ссылка по сути является вторым именем переменной и может использоваться в программе как ее дубликат. В этом случае и переменная и ссылка используют одну и ту же область памяти. Поскольку ссылка хранит адрес самой переменной.
Int l=8;
int &reff=l;
l++;
reff=reff+5;
printf(“%d”,reff);
Массивы и адресная арифметика.
ñ Сложение указателей
Складывать два указателя даже одного типа запрещено. Однако указател можно увеличить на целочисленную константу, при этом указатель увеличивается на велечину константа*размер_элемента_базового_типа
ñ Энкримент/декримент указателя выполняется по правилам увеличения/уменьшения указателя на числовую константу равную единице.
ñ Операции *,++,--,& являются равноправными и левонаправленными. Изменить порядок можно с помощью скобок. Рассмотрим сложение указателей на примере массива. Имя массива с точки зрения системы программирования Си представляет собой указатель на самый первый элемент массива (элемент номер 0). с именем массива можно работать как с обычным указателем, применяя к нему адресную арифметику. Однако изменять само значение адреса нужно с осторожностью
#include <stdio.h>
void main ()
{
int x[][3]={1,2,3,4,5,6,7,8,9};
printf(“/n%d %d %d %d”, *(*x),*(*(x+1)),*(*(*(x+1)+1)),*(*(x+2)+2));
} //1 4 5 9