Адресата всушност е бинарен запис за местоположбата на променливата. За приказ на адресата на променливата ја користиме &a. Адресите ќе бидат различни при секое стартување на програмот.
#include <iostream>
using
namespace
std;
int
main()
{
int
a = 5;
//promenliva 'a' so vrednost 5
int
*b;
//pokazhuvach kon podatok od tip int
b = &a;
//b ja sodrzhi adresata na a ("b pokazhuva kon a")
/*
double *k;
k = &a; //GRESHKA: pogreshen tip na pokazhuvach (double)
*/
cout << a << endl;
//pechati '5' (vrednosta na a)
cout << b << endl;
//pechati '0x27ff44' (adresata na a)
return
0;
}
'*' се чита "вредноста покажувана од" и ја враќа вредноста која се чува на одредена локација.
#include <iostream>
using
namespace
std;
int
main()
{
int
a = 5, b = 2;
int
*pa = &a, *pb;
//inicijalizacija
pb = &b;
//pb pokazhuva na b
*pa = 3;
cout << a <<
" "
<< *pa <<
" "
<< *pb << endl;
//pechati '3 3 2'
*pb = -1;
cout << b <<
" "
<< *pb << endl;
//pechati '-1 -1'
*pa = *pb;
cout << a <<
" "
<< b << endl;
//pechati '-1 -1'
pa = 0;
double
c = 8.0123, d = 0.0000;
double
*px;
px = &c;
(*px) += 2.0;
cout << (*px) << endl;
//pechati '10.0123'
px = &d;
cout << (*px) << endl;
//pechati '0'
return
0;
}
Големината на еден покажувач зависи од архитектурата на компјутерскиот систем на кој се извршува програмата и од оперативниот систем: 32-битен компјутерски систем ќе користи 32-битни мемориски адреси (и, соодветно, покажувачите ќе зафаќаат 4 бајти податочен простор), додека 64- битен компјутерски систем ќе користи 64-битни мемориски адреси (и, соодветно, покажувачите ќе зафаќаат 8 бајти податочен простор). Ова на никој начин не влијае на однесувањето на покажувачите: тие и понатаму можат да се искористат за пристап до податокот на кој покажуваат - без разлика на неговата големина
#include<iostream> using namespace std; int main() { int a = 5; int* pok_a = &a; cout <<"a = "<< a<< endl;// a = 5 *pok_a = a + 2; cout << "a = "<<a<<endl; // a = 7 return 0; }
a = 5
a = 7
•
void покажувачите се покажувачи кои
покажуваат кон вредност која нема тип , не е дефиниран тип
• Тоа
овозможува void покажувачите да покажуваат кон секој тип на податок од int вредност или float до string.
• Но
сепак се многу ограничени :
податокот на кој покажуваат не може да биде директно
дереференциран и заради тоа секогаш
треба да ја доделиме адресата на void покажувачот на некој покажувач од друг
тип на покажувач кој покажува на некој конкретен тип на податок пред да го
дереференцираме .
{
int x=56, y;
int *p, *q;
float f, *r;
void *v; // ne pokazuva kon tip na podatok
// p=123; ovaa komanda ne moze
p=&x; cout<<p<<endl;
q=p;
q=p+5; cout<<q<<endl;
// v se dodeluva na drug tip pokazuvac
v=p; cout<<v<<endl;
// q=v; ovaa komanda ne moze
q=(int *)v; cout<<q<<endl;
*p=3.21; cout<<*p<<endl;
*p=321; cout<<*p<<endl;
r=&f; cout<<r<<endl;
*r=7.8; cout<<*r<<endl;
*r=*q; cout<<*r<<endl;
// не може да биде директно дереференциран
// *v=456; ovaa komanda ne moze
Алокација на меморија
#include <iostream>
using namespace std;
int main()
{
int *parr;
parr = new int;
*parr = 2;
cout << *parr << endl; //pechati '2'
delete parr; //MNOGU VAZHNO!!!
int N = 100;
parr = new int[N]; //niza od 100 elementi
parr[5] = 3;
cout << parr[5] << endl; //pechati '3'
delete [] parr; //MNOGU VAZHNO!!!
return 0;
}
We know that a pointer variable always points to the address in memory. Among the operations that we can perform, we have the following arithmetic operations that are carried out on pointers.
- Increment operator (++)
- Decrement operator (- -)
- Addition (+)
- Subtraction (-)
#include <iostream> #include <string> using namespace std; int main() { int myarray[5] = {2, 4,6, 8,10}; int * myptr; myptr = myarray; cout<< "First element in the array :" <<*myptr<<endl; myptr ++; cout<< "next element in the array :" <<*myptr<<endl; myptr +=1; cout<< "next element in the array :" <<*myptr<<endl; myptr--; cout<< "next element in the array :" <<*myptr<<endl; myptr -= 1; cout<< "next element in the array :" <<*myptr<<endl; return 0; } |
Output:
First element in the array :2
next element in the array :4
next element in the array :6
next element in the array :4
next element in the array :2
using namespace std;
{
int *e, *t; //Declaring two int pointers variables
e = a; //assigning e to point the arrays initial element a[0]
t = a + size; // assigning variable t to the array last element
while(e != t)
{
cout << *e << " "; //displays the e
e++; // incrementing ( next element)
}
}
int main()
{
int a[] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
pointerarithmetic (a, 15);
return 0;
}
Низи и покажувачи
Кога креираме низа со одредена големина, името на променливата која ја користиме за пристап до елементите на таа низа е покажувач до првиот елемент на низата.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int main() { int array[] = {1, 2, 3, 4, 5}; cout << *array << endl; //pechati '1' *array = 0; //sega, array[] = {0, 2, 3, 4, 5} int *parr; parr = array; cout << *parr << endl; //pechati '0' return 0; } |
На пример, доколку array покажува на првиот елемент од одредена низа, тогаш array+1 покажува на вториот елемент од низата, array+2 покажува на третиот елемент од низата, итн.
Печатење неколку елементи од низата array:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <iostream> using namespace std; int main() { int array[] = {1, 2, 3, 4, 5, 6, 7}; int *parr = array; //kje ispechati '2 3 4 5 6 ' for ( int x=0; x<5; x++) { parr = parr+1; //parr kje pokazhuva na sledniot element cout << (*parr) << " " ; } parr--; //parr kje pokazhuva na prethodniot element cout << (*parr) << endl; //kje ispechati '5' parr = parr - 2; cout << (*parr) << endl; //kje ispechati '3' return 0; } |
р е динамичка променлива. Дозволено е p=p+2; или p++;
int main()
{
int x[5] = {1,2,3,4,5};
int *p;
p = x;
cout << x[0]<<x[1]<<x[2]<< endl;
cout << *p<< *(p+1)<<*(p+2)<< endl;
return 0;
}
using namespace std;
int main( )
{
int x[5] = {3,2,6,4,5};
int *p;
p = x;
//x=x+1; не е дозволено
*x=*x+3; // vrednosta na prviot element ( 3 ) se sobira so 3
cout<<*x<<endl; // 6
cout<<*x+1<<endl; // 7
cout<<*(x+1)<<endl; // 2 pristap do vtoriot element
p=p+1;
cout <<*x<<*(x+1)<<*(x+2)<< endl; // 626
// pristap do vtoriot element, pristap do tretiot element
cout <<*x<<*(x+2)<<*(x+4)<< endl; // 665
// pristap do tretiot element, pristap do pettiot element
cout << *p<< *(p+1)<<*(p+2)<< endl; // 264
return 0;
}
using namespace std;
int main()
{
int niza[100] = { 2,3,5,4,6 }, n = 5;
int* pok;
for (pok = niza; pok < niza + n; pok++)
{ cout << *pok << " ";
}
cout << endl;
return 0;
}
#include <iostream> #include <string> using namespace std; int main() { int myarray[5] = {1, 1, 2, 3, 5}; int * ptrvar; ptrvar = myarray; for ( int i=0;i<5;i++) { cout<<*ptrvar<< "\t" ; ptrvar++; } return 0; } |
Output:
1 1 2 3 5
Array of pointers
#include <iostream> #include <string> using namespace std; int main() { int myarray[5] = {2,4,6,8,10}; int *ptr[5]; //array of pointers for ( int i=0;i<5;i++){ ptr[i] = &myarray[i]; } for ( int i = 0; i < 5; i++) { cout << "Value of myarray[" << i << "] = " ; cout << *ptr[i] << endl; } return 0; } |
Output:
Value of myarray[0] = 2
Value of myarray[1] = 4
Value of myarray[2] = 6
Value of myarray[3] = 8
Value of myarray[4] = 10
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have address of the last element in pointer.
ptr = &var[MAX-1];
cout<<ptr<<endl<< " "<<*ptr<<endl;
for (int i = MAX; i > 0; i--)
{
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the previous location
ptr--;
}
return 0;
}
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have array address in pointer.
ptr = var;
cout<<ptr<<" "<<*ptr<<endl;
for (int i = 0; i < MAX; i++)
{
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the next location
ptr++;
}
return 0;
}