Documente Academic
Documente Profesional
Documente Cultură
INTRODUCERE
Un pointer este o variabilă ce conține adresa unei locații de memorie. Conținutul sau valoarea
pointerului este o valoare întreagă fără semn.
Declarare:
tip *nume_pointer;
tip* nume_pointer;
IMPORTANT:
declararea unui pointer nu înseamnă și inițializarea sa!!
deoarece un pointer poate accesa orice locație de memorie, este important ca pointerii să nu
fie utilizați înainte de inițializare.
Alternativă - declarare pointer NULL:
int *pnumber = NULL;
NULL e o constantă definită în multiple biblioteci standard (stddef.h, stdlib.h, stdio.h, string.h,
time.h, wchar.h, locale.h) și este echivalentul lui 0 pentru tipuri de date numerice
Operații cu pointeri
În operații se ține cont de faptul că adresele din pointeri au valori numerice întregi fără semn
Operație Definiție
Atribuire Dacă:
tip1 *id_ptr1;
tip2 *id_ptr2;
id_ptr1 = id_ptr2;
Adunare, scădere, Pot fi adăugate sau scăzute doar cantități întregi. Operațiile se efectuează
incrementare, relativ la tipul pointerului (int, float, char, etc.)
decrementare
Fie declarația:
tip *id_ptr;
Operațiile:
id_ptr+n, id_ptr-n
corespund adăugării/scăderii la adresa obținută în cadrul variabilei id_ptr a
valorii: n*sizeof(tip).
Analog se efectuează şi operațiile de incrementare/decrementare doar că
n este= 1/-1.
Rezultatul este corect doar atunci când pointerul adresează un tablou și
prin operatia aritmetică se produce o deplasare în interiorul limitelor
tabloului.
Operația de incrementare/decrementare se poate aplica: asupra pointeru-
lui însuşi; asupra valorii la care pointează.
OBSERVAȚII
• Scăderea a doi pointeri este permisă numai pentru pointeri de acelaşi tip ce referă un tablou,
rezultatul fiind o valoare care reprezintă diferența de adrese divizată la dimensiunea tipului de
bază (sizeof())
• Adunarea pointerilor NU este permisă !
• Datorită priorității tipului pointerului la adunare şi scădere, operanzii NU pot fi pointeri void sau
pointeri spre funcții!
Variante:
• parametrul formal este declarat ca un tablou fără dimensiune
int cauta(int p[], int n, int x );
Un pointer poate, indirect, să modifice o variabilă declarată cu modificatorul const, folosind ex-
presia:
*(tip *)&var;
NOTĂ! Modificarea se poate face într-o altă funcție, constanta îşi va păstra valoarea în funcția
în care a fost declarată
EXEMPLE
#include <stdio.h>
int main(void){
int i = 10, j=50;
int *iptr; // declarare pointer
int main(void){
int n, *pn;
float r, *pr;
printf("\nIntroduceti un numar intreg: ");
scanf("%d", &n);
pn = &n;
printf("\nReprezentarea in memorie a lui %d in hexa %x",n, n);
printf("\nReprezentarea pe bytes: 0x%02x %02x %02x %02x\n",
*((unsigned char *)pn+3), *((unsigned char *)pn+2),
*((unsigned char *)pn+1), *((unsigned char *)pn));
printf("\n Bitii baza 2 : ");
baza2(n);
3. Operaţii cu pointeri
#include <stdio.h>
int main(void){
int *pt_int;
float *pt_float;
int i = 10, j = 20;
float x = 1.2345, y = 32.14;
void *general;//pointer generic
pt_int = &i;
*pt_int += j;
© Adriana Stan, Ligia Chiorean, Mircea Vaida 5 Programarea Calculatoarelor - Limbaje
printf( "Valoarea lui i devine: %d\n", *pt_int);
general = pt_int;
*(int *)general = 0;
printf("Ultima valoare pentru i este: %d\n", i );
pt_float = &x;
y += 5 * (*pt_float);
printf("Valoarea lui y este: %f\n", y);
general = pt_float;
*(float *)general = 1.1;
printf("Ultima valoare pentru x este: %f", x);
}
#include <stdio.h>
Swap2(&i, &j);
printf("i = %d, j = %d \n", i,j);
}
TEME
1. Să se scrie un program care citeşte de la tastatură un şir de caractere, apoi elimină din şir
caracterele care se repetă şi afişează în final şirul obţinut, folosind pointeri.
2. Să se scrie un program care citeşte de la tastatură două şiruri de caractere şi afişează
numărul de caractere prin care ele diferă (adică numărul de caractere care există în primul şi nu
există în al doilea plus numărul de caractere care există în al doilea şi nu există în primul).
Folosiţi pointeri pentru accesul la elementele tablourilor.