Над указателями можно выполнять следующие операции

Указатели

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

Указатель может принимать следующие значения:

· адрес ранее определенной переменной, который можно получить с помощью операции &;

· указатель, уже имеющий значение;

· явно заданный адрес памяти с преобразованием типа.

Для обращения (доступа) к объекту, адрес которого содержит указатель, используется операция разыменования *.

Над указателями можно выполнять следующие операции:

· взятие адреса & &ptra;

· определение размера указателя sizeof(ptra);

· разыменование * *ptra;

· преобразование типов (char*)ptra;

· присваивание ptra=&a;

· сложение и вычитание целых чисел ptra+=3; ptra–=2;

· инкремент, декремент ptra++; ptra–-;

· вычитание указателей int n=ptra-ptrb;

· операции отношения == != > >= < <= ptra>ptrb;.

Пример 1. Примеры инициализации указателей

#include <stdio.h>

void main()

{int a=10;

printf("a=%d &a=%p n",a,&a);

Int *ptra=&a; //указатель проиниц. адресом переменной типа а

printf("ptra=%p &ptra=%pn",ptra,&ptra);

Int *ptrb=ptra; //указатель проиниц. значением указателя ptra

printf("ptrb=%p &ptrb=%pn", ptrb,&ptrb);}

int*ptrc=(int*)0xB8000000;//указатель проиниц. явным адресом

printf("ptrc=%p &ptrc=%p",ptrc,&ptrc);

}

Результат: a=___ &a=_________________

Ptra=___________ &ptra=___________

Ptrb=___________ &ptrb=___________

Ptrc=___________ &ptrc=___________

Расположение в памяти переменных представлено на рис.

  Адрес Содержимое
начало сегмента 8ADA:0000  
  . . .  
  8ADA:FFF2  
  8ADA:FFF3  
  8ADA:FFF4  
  8ADA:FFF5  
  8ADA:FFF6  
  8ADA:FFF7  
  8ADA:FFF8  
  8ADA:FFF9  
a 8ADA:FFFA  
  8ADA:FFFB  
  8ADA:FFFC  
  8ADA:0FFD  
адрес a 8ADA:FFFE  
  8ADA:FFFF  

Пример 2. Использование операции разыменования указателей

#include <iostream.h>

void main()

{float f=1.3;

float *pf=&f;

cout<<"pf="<<pf<<" *pf="<<*pf<<endl;

*pf=2.7;

cout<<" f="<<f<<endl;

int a=5;

int *pa=&a;

cout<<"pa="<<pa<<”*pa=”<<*pa<<endl;

}

Результат: pf=0xF9B0 0FFC *pf=_____

F=_____

Pa=0xF9B0 0FFA *pa=______


Пример 3. Использование вычитания указателей типа int

#include <stdio.h>

void main()

{int a=1,b=7,c;

int*pa=&a, *pb=&b, *pc=&c;

printf("pa=%p pb=%p pc=%pn",pa,pb,pc);

printf("pa-pb=%dn",pa-pb);

printf("pa-pc=%dn",pa-pc);

}

Результат: pa=8B04:FFFE pb=8B04:FFFC bc=8B04:FFFA

Pa-pb=__ pa-pc=__

#include <stdio.h> void main() {long al=2L,bl=7L,cl;

Pal-pbl=__ pal-pcl=__

#include <stdio.h> void main() {int a=10,b=20,c=30;

_______ ___ __

_______ ___ __

_______ ___ __


Пример 6. Использование операции многократного разыменования указателя

#include <iostream.h>

void main()

{int i=5;

int *pi=&i;

int **ppi=&pi;

int ***pppi=&ppi;

Cout<<" &i="<<&i<<endl; // &i=0x8f86 010с

Cout<<" &pi="<<&pi<<endl; // &pi=0x8f86 0108

Cout<<" &ppi="<<&ppi<<endl; // &ppi=0x8f86 0104

Cout<<" &pppi="<<&pppi<<endl;// &pppi=0x8f86 0100

Cout<<" pppi="<<pppi<<endl; // pppi=_____________

Cout<<" *pppi="<<pppi<<endl; // *pppi=____________

Cout<<" **pppi="<<pppi<<endl; // **pppi=____________

Cout<<"***pppi="<<pppi<<endl; // ***pppi=___

}

  Адрес Содержимое
адрес указателяpppi 8F86:0100  
адрес указателяppi 8F86:0104  
адрес указателяpi 8F86:0108  
адрес переменнойi 8F86:010c  

Пример 7. Использование операций разыменования, инкремента, декремента и взятия адреса

#include <stdio.h>

void main()

{int a=1,b=2,c=5;

int *ptr=&b;

Printf("&c=%pn",&c); // &c=8ff0:0050

Printf("&b=%pn",&b); // &b=8ff0:0052 //ptr=&b

Printf("&a=%pn",&a); // &a=8ff0:0054

Printf("*&b=%dn",*&b); // *&b=__

Printf("*&++b=%dn",*&++b); // *&++b=__

Printf("*ptr=%dn",*ptr); // *ptr=__

Printf("*ptr++=%dn",*ptr++); // *ptr++=__

printf("*ptr=%dn”,*ptr); // *ptr=__ (*)

Printf("++*ptr=%dn”,++*ptr); // ++*ptr=__

Int m=10,n=20; // &n=8ff0:0060 &m=8ff0:0062

int *pm=&m;

Printf("++*--pm=%dn”,++*--pm); // ++*--pm=__

Указатели и константы Указатель – константа – указатель, значение (хранящийся адрес) которого нельзя… Пример 8.

Имя массива– этоуказатель-константа,значением которого служит адрес нулевого элемента массива.

Пример 11.

#include <stdio.h>

void main()

{int m[]={1,2,3,4},i;

Printf("*m=%d *(m+1)=%dn",*m,*(m+1));// ___________

char str[]="BORLAND C++";

for(i=8;i<11;i++)

Printf("%c",*(str+i)); //________

}

Пример 12

#include <stdio.h>

void main()

{const n=5; float farr[n];

for(int i=0;i<n;i++)

{scanf("%f",&farr[i]);

*(farr+i)=*(farr+i)**(farr+i);

printf("%.3fn",i[farr]);

}

Пример 13.

#include <stdio.h>

void main()

{char st[]="СОНET";

char *pst=&st[2];

Printf("%c%c%cn",pc[0],pc[-1],pc[-2]); // _______

Printf("%c",*pc); // __

Printf("%c",*++pc); // __

Printf("%c",*++pc);} // __