Pointerat 1

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 8

C++ Pointerat

Pointerat (Shenjuesat)

Adresat.

Ne momentin qe deklarojme nje variabel ai ruhet ne nje vend konkret ne memorje. Zakonisht nuk e
vendosim ne se ku do te ruhet ky variabel sepse kjo behet automatikisht nga kompilatori dhe sistemi
operativ gjate ekzekutimit. Por ne momentin qe sistemi operativ ke vendosur nje adrese, ka disa raste
kur duam te dime, ku eshte ruajtur ky variabel.

Kjo realizohet duke paraprire variablin me (&)qe jep adresen :

int v;

int*p;

p = &v;

Nje variabel qe ruan adresen e nje variabli tjeter quhet shenjues(pointer).

Operator i References (*)

Duke perdorur pointerat aksesojme direkt vleren e ruajtur ne variablin ku po shenjon ,duke perdorur
operator asterisk (*), qe perkthehet "vlera ku po shenjohet". Per shembull,

int a=*p; dhe a mer vleren v.

Deklarimi i variablave me tipin pointer

Ne saje te aftesise se pointerit per te kapur vleren ku po shenjonbehet e domosdoshme te specifikohet


tipi I te dhenave ku do shenjoj ky pointer qe ne momentin e deklarimit. Sintaksa e deklarimit te
pointerit eshte: tipi * emer_pointeri;

asterisku (*) qe perdoret ne deklarimin e pointer-it tregon qe variabli eshte pointer, dhe nuk
duhet ngaterruar me operatorin (*) qe perdoret si operator reference.

// my first pointer
#include <iostream.h>

int main ()
{
int value1 = 5, value2 = 15;
int * mypointer;

mypointer = &value1;
*mypointer = 10;
mypointer = &value2;
*mypointer = 20;
cout << "value1==" << value1 << "/ value2==" << value2;

1
C++ Pointerat
return 0;
}

Pointerat dhe vektoret

Identifikuesi i nje vektori eshte ekuivalent me adresen e elementit te pare te tij. Ne fakt jane e njejta
gje. Per shembull:

int numbers [20];


int * p;

eshte i vlefshem vleredhenja:

p = numbers; // dhe p shenjon te elementi i pare i vektorit

Shembull:

// more pointers
#include <iostream.h>

int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;

10, 20, 30, 40, 50,

Te vektoret ne pame perdorimin e kllapave [] per te percaktuar indeksin e elementit te


vektorit qe duam ti referohemi. Kete menyre mund ta zevendesojme edhe me

a[5] = 0; // elementi 6
*(a+5) = 0; // shenjon (a+5)
Keto te dyja jane ekuivalente.

Inicializimi i pointerave

Kur deklarojme mund edhe te inicializojme:

int number;
int *tommy = &number;

2
C++ Pointerat
eshte ekuivalent me:

int number;
int *tommy;
tommy = &number;

Aritmetika e pointerave

Per pointerat mund te perdoren veprimi i + dhe -.

Kur kemi deklaruar tipet e te dhenave, kemi percaktuar gjithashtu madhesine e memorjes qe
zene secili prej tyre. Per shembull ne rastin e numrave integer, char ze 1 byte, short ze 2 byte
dhe long ze 4.

Supozojme se kemi 3 pointera:

char *mychar;
short *myshort;
long *mylong;

dhe dime se ata shenjojne ne adresen 1000, 2000 and 3000 perkatesisht.

Nese shkruajme:

mychar++;
myshort++;
mylong++;

mychar, duhet te shenjoj te 1001. Ndersa, myshort te adresa 2002, dhe mylong do te kete vleren 3004.
Kjo per arsye se, kur shtojme pointerin me 1 po bejme te mundur qe shenjuesi te shenjoj 1 element
me tej dhe numri i byteve qe do te spostohet percaktohet nga numri i byteve per cdo tip..

Duhet te cilesojme se si operatori increase (++) dhe decrease (--) kane prioritet me te madh se sa
operatori i references (*), Keshtu qe:

3
C++ Pointerat
*p++;
*p++ = *q++;

E para eshte ekuivalent me *(p++) rrit vleren e pointerit p (dhe jo vleren qe pemban).
ne te dyten, per faktin se operatoret (++) jane mbas shprehjes qe po vleresohet. Atehere fillimisht
vlera e *q i kalohet te *p dhe pastaj te dy pointerat inkrementohen. Eshte ekuivalent me:

*p = *q;
p++;
q++;

Shenjuesat mbi shenjuesa

C++ lejon perdorimin e shenjuesve mbi shenjues. Per shembull:

char a;
char * b;
char ** c;
a = 'z';
b = &a;
c = &b;

Supozojme se adresat jane 7230, 8092 and 10502, atehere:

(Brenda kuadrateve jane vlerat; poshte jane adresat)

c eshte variabel i tipit (char **) me vlere 8092


*c eshte variabel i tipit (char*) me vlere 7230
**c eshte variabel i tipit (char) me vlere 'z'

Shenjuesat void

Shenjuesi i tipit void eshte nje tip special shenjuesi. Shenjuesat void mund te shenjojne ne cdo tip te
dhenash, integer, float , string karakteresh . Te dhenat ku do shenjojne nuk kapen direkt, perderisa
gjatesia e tyre eshte e papercaktuar, per kete arsye do te perdorim type casting.

Nje nga perdorimet eshte kalimi i argumentave te pergjithshem jo te specifikuar:

// integer increaser
#include <iostream.h>

void increase (void* data, int type)


4
C++ Pointerat
{
switch (type)
{
case sizeof(char) : (*((char*)data))++; break;
case sizeof(short): (*((short*)data))++; break;
case sizeof(long) : (*((long*)data))++; break;
}
}

int main ()
{
char a = 5;
short b = 9;
long c = 12;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
increase (&c,sizeof(c));
cout << (int) a << ", " << b << ", " << c;
return 0;

6, 10, 13

Shenuesat mbi funksione

C++ lejon operacione me shenjuesat te funksionet. Perdorimi me i madh i tyre eshte per te kaluar nje
funksion si nje parameter te nje funksion tjeter, sepse kjo nuk realizohet dot ndryshe. Me qellim qe te
deklarojme nje shenjues mbi je funksion duhet ta deklarojme si prototip te funksionit pervec emrit qe
mbyllet ne kllapa () dhe nje pointer asterisk (*) shtohet para emrit. Shembull:

// pointer to functions
#include <iostream.h>

int addition (int a, int b)


{ return (a+b); }

int subtraction (int a, int b)


{ return (a-b); }

int (*minus)(int,int) = subtraction;

int operation (int x, int y, int (*functocall)(int,int))


{
int g;
g = (*functocall)(x,y);
return (g);
}

int main ()
{
5
C++ Pointerat
int m,n;
m = operation (7, 5, addition);
n = operation (20, m, minus);
cout <<n;
return 0;
}
Output: 8

Ne kete shembull, minus eshte nje pointer global mbi nje funksion qe ka dy parametra te tipit int,
menjehere kalohet per te shenjuar te funksioni subtraction, me ane te nje komande:

int (* minus)(int,int) = subtraction;

Memorja dinamike

Deri tani ne programet tona, kemi perftuar ate memorje qe kemi kerkuar nga deklarimet e
variablave. Po nese duam te huazojme nje memorje madhesine e te ciles e percaktojme
vetem gjate ekzekutimit?

Pergjigjja eshte memorja dinamike, per te cilen C++ perdor operatoret new dhe delete.

Operatori new dhe new[ ]


Me qellim qe te huazojme nje memorja dinamike, perdoret operatori new. I cili shoqerohet
nga nje tip te dhenash dhe ne menyre opsionale numrin e elementeve brenda []. Kthen nje
shenjues mbi bllokun e huazuar

pointer = new type

pointer = new type [elements]

E para tregon huazim te memorjes per te mbajtur nje element type. E dyta perdoret per te mbajtur nje
bllok elementesh te tipit type. Per shembull:

int * b;
b = new int [5];

ne kete rast huazohet hapsira per 5 elemente int dhe kthen nje pointer mbi bllokun e memorjes.

Huazimi i memorjes dinamike lejon huazim memorje gjate ekzekutimit te programit.

Memorja dinamike qe gjenerohet zakonisht menaxhohet nga sistemi operativ. Ka raste kur
sistemi operativ nuk e gjen ate sasi memorje qe ti kerkon te huazosh me new, ne kete rat
kthehet nje pointer null. Per kete arsye eshte e rekomandueshme te kontrollohet nese
huazimi i memorjes u krye. Per shembull

6
C++ Pointerat
int * b;
b = new int [5];
if (b == NULL) {
// error.
};

Operator delete.
Per te mundesuar huazim sa me te mire te memorjes dinamike kur ajo nevojitet, duhet te
clirohet ne momentin qe nuk perdoret me. Operatori delete perdoret per kete qellim:

delete pointer;

delete [] pointer;

E para fshin memorjen e huazuar per nje element te caktuar, dhe e dyta memorjen e huazuar per
vektore elementesh (arrays).

#include <iostream.h>
#include <stdlib.h>

int main ()
{
char input [100];
int i,n;
long * l;
cout << "How many numbers do you want to type in? ";
cin.getline (input,100); i=atoi (input);
l= new long[i];
if (l == NULL) exit (1);
for (n=0; n<i; n++)
{
cout << "Enter number: ";
cin.getline (input,100); l[n]=atol (input);
}
cout << "You have entered: ";
for (n=0; n<i; n++)
cout << l[n] << ", ";
delete[] l;
return 0;
}

Output:

How many numbers do you want to type in? 5


Enter number : 75
Enter number : 436
Enter number : 1067
Enter number : 8
Enter number : 32
You have entered: 75, 436, 1067, 8, 32,
7
C++ Pointerat

NULL eshte nje vlere konstante qe percaktohet ne librarite e C++ dhe domethene shenjuesa
null. Zakonisht vlera NULL percaktohet 0:

Memorja dinamike ne C

Operatoret new dhe delete perdoren vetem ne C++ dhe nuk jane te vlefshme per C, per te huazuar
memorje perdorej:

Funksioni malloc
Sintaksa eshte:

void * malloc (size_t nbytes);

ku nbytes eshte numri i byteve qe duhet ti kalojme shenjuesit. Tipi void ben qe te perdoret
type_casting Per shembull:

char * r;
r = (char *) malloc (10);

Kjo i kalon r nje bllok me 10 byte. Ose mund te perdoret:

int * b;
bo = (int *) malloc (5 * sizeof(int));

Kjo ben qe te b te kaloj nje bllok me 5 integer me madhesi 2, 4 duke u varur nga sistemi ku po
kompilohet.

Funksioni free.
Cliron memorjen qe eshte huazuar nga malloc.

Sintaksa eshte:

void free (void * pointer);

You might also like