Documente Academic
Documente Profesional
Documente Cultură
INTRODUCERE
Tablouri și pointeri
Identificatorul unui tablou este un pointer constant la primul element din tablou. Această valoare
poate fi atribuită unui alt pointer. Poate fi folosit pentru accesul la elementele tabloului folosind ar-
itmetica pointerilor
Spre deosebire de pointeri (ce pot fi modificați pe parcursul unui program), identificatorul unui
tablou este un pointer constant!!
Indexare pointeri
Indexarea unui pointer asemenea unui tablou are sens doar dacă referă un tablou:
int *p = tab;
printf("%d", p[i]);//echivalent cu *(p+i)
Dacă p pointează pe un tablou, compilatorul C/C++ generează cod mai scurt pentru *(p+i) decât
pentru p[i]
OBS: dacă un pointer referă un tablou și se folosește operatorul de indexare [ ], operatorul de
indirectare * nu mai e folosit.
Dacă un pointer nu pointează pe un tablou, el poate fi indexat, dar rezultatul este imprevizibil.
Elementele unui tablou pot fi accesate și prin operații aritmetice specifice pointerilor
*(tab+i)
reprezintă un tablou de adrese. Se folosesc mai ales la crearea de tablouri de şiruri de carac-
tere
Tablourile de pointeri pot fi accesate cu pointeri dubli
char *a[5];
char **p; // pointer dublu catre caractere
p = a;
p va conține adresa primului element al tabloului a, unde vom avea un pointer spre un caracter,
astfel încât (p+1) va indica elementul a[1], etc.
Indirectarea multiplă
Declaratori complecși
Un declarator complex este un identificator însoțit de mai mult de un modificator de tipurile:
• de date, [ ]
• pointer, *
• funcție, ( )
Aceste combinații variate pot fi aplicate aceleiași variabile (identificator) cu unele excepții:
• un tablou nu poate fi compus din funcții
• o funcție nu poate returna o funcție sau un tablou
Evaluarea declaratorilor:
• parantezele ( ) și [ ] din dreapta (funcții și tablouri) identificatorului au prioritate mai mare
decât * din stânga identificatorului
• parantezele ( ) și [ ] au aceeași prioritate, asocierea făcându-se de la S ->D
• specificatorul de tip este aplicat în ultimul pas, când declaratorul a fost complet evaluat
• parantezele ( ) ca și operator, se pot folosi pentru a schimba asocierea implicită, forțând
una explicită
Observații:
Standardul ANSI permite scrierea apelului fără a folosi operatorul de indirectare *:
pf (lista_param_actuali);
sau
var = pf (lista_param_actuali);
Parantezele permit distingerea între declarația unui pointer de funcție şi prototipul unei funcții
care returneaza un pointer:
tip_rez *nume_f(...); //functie ce returneaza un pointer
tip_rez (*nume_pf)(…); //pointer de functie
EXEMPLE
1. Program pentru determinarea celui mai mic element dintr-un tablou unidimensional.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define DIM 20
int main(void){
int i, dim, min;
int x[DIM];
printf("\nIntroduceti dimensiunea tabloului unidimensional: ");
scanf("%d", &dim);
if(dim > DIM)
{
printf("\n Dimensiune prea mare !\n");
return 0;
}
#include <stdio.h>
int main(void){
int result;
3. Program care preia de la consolă mai multe numere întregi ca şi valori de rezistenţe şi cal-
culează rezistenţa echivalentă grupării serie sau paralel.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void){
int i, n, tab[DIM];
float rez;
char grp;
switch(toupper(grp))
{
case 'S': rez = calcul(tab, n, serie);
break;
case 'P': rez = calcul(tab, n, paralel);
break;
default: printf("\n Operatie invalida !");
return 0;
}//end switch
printf("\n Rezistenta echivalenta este: %f\n", rez);
return 0;
}//end main
4. Program care preia din linia de comandă numere întregi şi afişează suma acestora.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
if (argc == 1) {
printf("\n\n\tNu ati introdus numerele de adunat !");
return 0;
}//end if
else{
for(i=1; i<argc; i++){
n = atoi(argv[i]);
suma += n;
}//end for
printf("\nSuma argumentelor din linia de comanda este :
%d\n", suma);
return 0;
}//end else
}//end main
TEME
1. Rezolvaţi problemele din laboratorul de aplicaţii cu tablouri (laboratorul 8, problemele 1-12)
folosind pointeri.
2. Să se citească doi parametri întregi şi alţi doi flotanţi din linia de comandă. Să se afişeze suma
şi produsul lor.
3. Scrieţi o aplicaţie care citeşte de la tastatură un şir de caractere cu lungimea mai mare decât
7. Folosiţi un pointer pt. a accesa şi afişa caracterele de pe poziţiile 1, 3, 5 şi 7.
4. Citiţi de la tastatură elementele a 2 matrici de valori întregi. Scrieţi o funcţie care primeşte ca
parametri pointerii la cele 2 matrici şi returnează un pointer la matricea sumă. Rezultatul în-
sumării matricelor va fi afişat în funcţia main. Afişaţi elementele de pe diagoanala secundară a
matricii sumă, folosind acelaşi pointer.
9. Scrieţi un program care citeşte de la tastatură elementele de tip float ale unui tablou unidimen-
sional, elemente ce reprezintă mediile unei grupe de studenţi. Să se scrie o funcţie care deter-
mină numărul studenţilor cu media >= 8. Afişaţi rezultatul în main(). (lucrati cu pointeri, fără vari-
abile globale).
10. Scrieţi un program C în care se citesc de la tastatură elementele de tip întreg ale unui tablou
unidimensional A prin intermediul unei funcţii. Scrieţi o altă funcţie care completează un tablou
unidimensional B. Fiecare element al lui B este obţinut prin scăderea mediei aritmetice a tuturor
elementelor din A din elementul corespunzător din A. Scrieţi o funcţie care permite afişarea unui
tablou unidimensional şi afişaţi tablourile unidimensionale A şi B. (utilizând pointeri, fără variabile
globale).
Ex:
A=123456789
medie aritmetica = 5
B = -4 -3 -2 -1 0 1 2 3 4
11. Scrieţi un program în care se citesc de la tastatură elementele de tip întreg ale unei matrici
pătratice, utilizând o funcţie. Scrieţi o funcţie care determină numărul de elemente negative de
deasupra diagonalei secundare. Afisaţi rezultatul în main() (fără variabile globale).
Ex:
A = 1 -2 -3
23 0
45 6
Out: 2
12. Scrieţi un program în care se citesc de la tastatură elementele de tip întreg ale unei matrici
pătratice, utilizând o funcţie. Scrieţi o funcţie care interschimbă două linii ale matricii. Afişaţi cu o
funcţie matricea iniţială şi cea obţinută. Dimensiunea matricii şi numerele ce identifică liniile care
vor fi interschimbate se citesc de la tastatură, în funcţia main. (fără variabile globale).
Ex:
A=13579
B=2468
out: 1 2 3 4 5 6 7 8 9
14. Ordonaţi crescător un tablou unidimensional de numere întregi folosind funcţia de bibliotecă
qsort() din stdlib.h. Folosiţi acelaşi algoritm pentru numere de tip float şi ordonaţi descrescător.