CATEGORII DOCUMENTE |
Introducere in programare
Programele de calculator , cunoscute si sub numele de software, sunt constituite dintr-o serie de instructiuni pe care le executa calculatorul . Cand se creaza un program , trebuie sa se specifice instructiunile pe care calculatorul trebuie sa le execute pentru a realiza operatiile dorite . Procesul de definire a instructiunilorpe care le executa calculatorul este numit programare . Cand se creeaza un program , instructiunile se pastreaza intr-un fisier ASCII al carui nume contine , de obicei,extensia C pentru un programC si extensia CPP pentru un program C++.
Un limbaj de programare reprezinta o interfata intre problema de rezolvat si programul de rezolvare.
Limbajul de programare, prin specificarea unor actiuni care trebuie executate eficient este apropiat de masina. Pe de alta parte, el trebuie sa fie apropiat de problema de rezolvat, astfel incat solutia problemei sa fie exprimata direct si concis.
Trecerea de la specificarea problemei la program nu este directa, ci presupune parcurgerea mai multor etape:
analiza si abstractizarea problemei. In aceasta etapa se identifica obiectele implicate in rezolvare si actiunile de transformare corespunzatoare. Ca rezultat al acestei etape se creaza un univers abstract al problemei , care evidentiaza o multime de tipuri de obiecte, relatiile dintre acestea si restrictiile de prelucrare necesare rezolvarii problemei.
gasirea metodei de rezolvare acceptabile, precizand operatorii de prelucrare ai obiectelor.
elaborarea algoritmului de rezolvare
codificarea algoritmului
Limbajul C a fost creat de Dennis Ritchie in 1972.
Limbajul C s-a impus in elaborarea programelor datorita:
usurintei de reprezentare a obiectelor cu caracter nenumeric
capacitatii de reprezentare a obiectelor dinamice
capacitatii de exploatare a caracteristicilor masinii de calcul pentru controlul strict al performantelor programului
asigurarii unei interfete transparente cu sistemul de operare al masinii utilizate.
A fost creat pentru realizarea sistemului de operare UNIX . UNIX este unul dintre primele sisteme de operare puternice (mai sunt si azi folosite).Linux a fost inspirat din UNIX. Numele Linux vine de la Linus (asa il cheama pe cel care a creat Linux) si X (ultima litera din Linux) vine de la UNIX.
C este un limbaj de programare care este puternic si flexibil. Cu el se creaza sisteme de operare
(Linux de exemplu), jocuri, si orice alte programe care au nevoie de viteza si resurse utilizate eficient.Codul scris in C este mai dificil decat in limbajele ca Pascal, Java dar este mai rapid.
C este la baza C++, adica C++ extinde C cu noi posibilitati. C++ contine tot ce este in C.
Multi programatorifolosesc limbaje de programare ca BASIC , PASCAL si FORTRAN. Fiecare limbaj de programare are facilitati specifice si propriile puncte forte (dar si slabiciuni). Oricum , limbajele de programare exista pentrua ne permite sa definim instructiunilepe care vrem sa le execute calculatorul.
Instructiunile pe care le executa un calculator sunt de fapt grupuri de 1 si 0 (cifre binare) care reprezintasemnaleelectronice produse in interiorulcalculatorului. Pentru a programa primele calculatoare (in anii1940~1950), programatoriitrebuiau sa inteleaga modul in care calculatorul interpretadiferitele combinatii de 0 si 1 , deoareceprogramatoriiscriau toate programele folosind cifre binare. Cum programeledeveneaudin ce in ce mai mari , acest mod de lucru a devenit foarte incomod pentru programatori.De aceea cercetatorii au creat limbaje de programare care permit exprimarea instructiunilor calculatorului intr-o forma mai accesibila omului. Dupa ce programatorii scriau instructiunile intr-un fisier (numit fisier sursa ) , un al doilea program (numit compilator), converteainstructiunile limbajului de programare in sirurile de 1 si 0 (cunoscutesub numele de cod masina ) pe care le putea intelege calculatorul.Fisierele cu extensiaexe sau com contin codul masina (siruri de 1 si 0) pe care calculatorul il va executa.
Dupa ce se creeaza un fisier sursa , trebuie rulat un compilator pentru a converti instructiunile intr-un format pe care calculatorul poate sa-l execute .
Crearea unui fisier sursa .
Cand se creeaza un program, instructiunilepe care doriti sa le execute calculatorul trebuie plasate intr-un fisier numit fisier sursa. Daca nu se foloseste Turbo C++ Lite sau un compilator-editor performant,trebuie sa se creeze fisierele programuluifolosind un editor ASCII , cum ar fi programul EDIT pe care il ofera sistemul de operare DOS. Nu se pot crea programe folosind un procesor de text (cum ar fi MicrosoftWord ). Procesoarelede text permit sa se formateze documentele , aliniind marginile , scriind caractere cursive sau subliniindtextul si asa mai departe.Pentru a realiza toate aceste operatii , procesoarele de text introduc caractere speciale in interiorul documentelor . Cu toate ca acestecaractereau sens pentru procesorul de text , ele vor deruta compilatorul care converteste fisierul sursa in cod masina si aceasta confuzie va cauza erori. Cand se creeaza fisierul sursa cu procesorul de text, asigurati-va ca i-ati dat un nume care descrie cu acuratete functia programului.
Daca , pe de alta parte , se foloseste un compilator care include un editor intern, se pot crea programele in cadrul acestui editor. De exemplu, daca se foloseste Turbo C++ Lite, se poate crea un nou fiser program cu optiunea New din meniul File. Pentru a se crea un program cu ajutorul produsuluiTurbo C++ Lite, trebuie sa se execute urmatorii pasi:
Se selecteaza meniul File optiunea New. Turbo C++ Lite va crea fiserul nonameOO.cpp.In fereastra nonameOO.cpp , se introduce codul urmator:
#include<stdio.h>
void main( )
Se selecteaza meniul File, optiunea Save As.Turbo C++ Lite va afisa caseta de dialog Save.
File save As
In caseta de dialog File Save As se introduce numele primul .c si se apasa ENTER . Turbo C++ Lite va salva fiserul program primul.c.
Cu toate ca programul primul. c contine cinci linii, numai instructiuneaprintf are de fapt un rol activ . Cind se executa acest program , printf va afisa pe ecran mesajul Totul despre C si C++ . Fiecare limbaj de programare (la fel ca si limba engleza, franceza sau germana) are un set de reguli, denumitereguli sintactice , caruiatrebuie sa va conformati cand se foloseste respectivul limbaj. De asemenea, trebuie sa va supuneti regulilor sintactice ale limbajelor de programare C atunci cand creati programe in C. Printre aceste reguli sintactice se numara introducerea parantezelordupa numelemainsi utilizarea semnului punct si virgula la sfarsitul instructiunii printf.
Cand se scrie programul , trebuie sa se aibe mare grija sa nu se omita vreunul din aceste elemente. Se verifica a doua oara ceea ce s-a scris, pentru a va asigura ca ati introdus corect instructiunile programuluiC , exact asa cum apar in exemplul de mai sus. Dacanu sunt greseli, se salveaza continutulfisierului pe disc instructiunileprogramului C in limbajul masina pe care calculatorul poate sa-l inteleaga si sa-l execute.
Compilarea programului in C .
Un program executabil,pe de alta parte , contine instructiuni exprimate ca siruri de 1 si 0, pe care le intelege ca1culatorul. Procesul de conversie a fisierului sursa C in limbaj masina este cunoscut sub numele de compilare. In functie de compilatorul C care se foloseste , comanda care trebuie executata pentru a compila fisierul sursa va fi diferita. Presupunand ca se utilizeaza produsul Turbo C++ Lite se poate compila programulcreat folosind urmatoarea secventa de comenzi:
1. Se selecteaza meniul Compile , optiunea Build All. Turbo C+ Lite va afisa caseta de dialog Compiling (compilare).
2. Daca operatia de compilare se incheie cu succes, compilatorul va afisa mesajul Press any key (apasati oricetasta).In cazul in care compilatorul nu creeaza fisierul ci afiseaza mesaje de eroare pe ecran , probabilca s-a incalcat o regula sinctactica a limbajului .
3. Daca sereuseste sa se scrie instructiunile in C exact , compilatorul va crea un fisier executabil denumit primul.exe. Pentru a executa programul primul.exe, se poate selecta optiunea Run din meniul Run sau se foloseste combinatia de taste Ctrl + F9.
Cand se executa programul,ecranul va afisa urmatorul rezultat:
Totul despre C/c++
Erorile de sintaxa .
Dacase incalca o regula sintactica ,programul nu va fi compilat cu succes . Intr-o astfel de situatie , compilatorulva afisa pe ecran mesaje de eroare ce precizeaza linia din program care contine eroarea , precum si o scurta descriere a greselii . Lipsa unui singur caracter poate provoca o serie de erori incascada in cadrul compilarii (o eroare duce la alta ).
Structura unui program in C .
C - ul este un limbaj de programare compus din functii , programele in C contin o singura functie principala ( main ) ce reprezinta punctul de intrare in program .
Forma generala a unei functii este :
void main ( )
fiecare instructiune normala se va termina cu punct si virgula . main( ), #include <stdio.h>, nu sunt urmate de pentru ca nu sunt instructiuni normale.
Deci un program obisnuit in C va fi:
#include <stdio.h>
void main()
Fuctia main reprezinta functia programului principal realizata in limbajul C , iar tipul de data ( void ) se foloseste cand functia nu returneaza nici o valoare .
Pentru scrierea programelor in C inainte de scrierea functiei principale (main ) utilizatorul ( programatorul ) trebuie sa includa bibliotecile din care sunt apelate functiile utilizate in cadrul programului , bibliotecile care sunt incluse in programul sursa pot fi :
- ale compilatorului de C.
- scrise de catre utilizator .
Exemplu de includere a unei biblioteci a compilatorului de C :
1) #include<stdio.h> - utilizatorul poate sa utilizeze functiile de intrare - iesire standard (scanf , printf ) .
2) #include<functii.h> - programul principal poate apela functii scrise de catre utilizator care sunt definite in fisierul functiei h .
Definitii si declaratii de variabile .
In C o variabila este un loc in memorie unde se poate pune date, acelui loc i se da un nume care va fi si numele variabilei.Variabilele sunt de mai multe tipuri si fiecare tip are anumite instructiuni pentru el.
Deci o variabila este un loc in memoria calculatorului care are:
- un nume
- este de un anumit tip
- contine niste date din acel tip
O valoare constanta se reprezinta textual (este un literal) sau printr-un nume - constanta simbolica.
O variabila este un nume (identificator) care desemneaza o locatie de memorie in care se pastreaza o valoare.
O variabila se caracterizeaza asadar prin: nume (adresa), tip si valoare, atributul valoare putand fi modificat. De exemplu:
int n, p;
char c;
float eps;
O variabila poate fi initializata la declararea ei. Initializarea se face numai o data, inaintea executiei programului.Variabilele externe si statice sunt initializate implicit la 0.
Pentru o variabila automatica (declarata in interiorul unui bloc), pentru care exista initializare explicita, aceasta este realizata la fiecare intrare in blocul care o contine.
In C++ calificatorul const aplicat unui nume simbolic arata ca acesta nu mai poate fi modificat pe parcursul programului si reprezinta o constanta. Definirea unei constante presupune si initializarea acesteia.
const float pi=3.1415926;
O definitie este o constructie textuala care asociaza unui nume o zona de memorie (un obiect) si eventual initializeaza continutul zonei cu o valoare corespunzatoare tipului asociat numelui.
O variabila globala se declara inainte void main si este cunoscuta din momentul in care se declara , in toate functiile care se gasesc definite dupa aceasta , inclusiv in programul principal .
Atribuirea.
Atribuirea simpla este de forma: variabila = expresie si are ca efect modificarea valorii unei variabile.
Atribuirea compusa a op= b reprezinta intr-o forma compacta operatia a = a op b
Atribuirea multipla este de forma variabila1 = variabila2 = . = expresie si initializeaza variabilele, pornind de la dreapta spre stanga cu valoarea expresiei.
Operatorii de incrementare folositi in atribuiri au efecte diferite. Astfel:
a = ++b este echivalenta cu b=b+1; a=b; in timp ce:
a = b++ are ca efecta=b; b=b+1;
Cuvinte cheie.
Cuvintele cheie sau cuvintele rezervate nu pot fi folosite ca identificatori. Acestea sunt:
auto break case char const continue
default do double else enum extern
float for if int long register
return short signed sizeof static struct
switch typedef union unsigned void volatile
while
Comentarea programelor .
Comentariile in C pot fi oriunde in program: la inceput inainte de #include <stdio.h>, sau inainte de main( ) sau la sfarsitul programului sau intre acolade.
Programul foloseste un comentariu, delimitat prin /* si */ care, prin explicatii in limbaj natural, creste claritatea programului. Comentariul este constituit dintr-o linie sau mai multe linii, sau poate apare in interiorul unei linii. Nu se pot include comentarii in interiorul altor comentarii.
In C++ se utilizeaza comentarii care incep cu // si se termina prin sfarsitul de linie.Un comentariu este un mesaj care ajuta sa se citeasca si sa se inteleaga programul .Cand compilatorul de C intalneste caracterele pentru comentariu , el ignora textul care urmeaza pana la terminarea comentariului .
Prezentarea functiei printf .
Functia printf se foloseste pentru a afisa mesaje pe ecran. Cand programul foloseste printf, datele care se vor a se afisa reprezinta parametriisau argumentele functiei printf. Urmatoareainstructiune foloseste functia printf pentru a afisa pe ecran mesajul Totul despre C/C++:
printf(''Totul despre C si C++ '' ) ;
In acest caz , sirul de caractere(literelecare apar intre cele douaghilimele)constituie singurul argumental functiei printf. Cand programul incepesa lucreze cu variabile, se va dori sa folositi printf pentru a afisa valoarea fiecarei variabile. Functia printf accepta mai multi parametri.Primul parametrutrebuie sa fie intotdeauna un sir de caractere. Parametrii care urmeaza primului sir de caractere pot fi numere, variabile, expresii sau chiar alte siruri de caractere. Atunci cand se doreste ca printf sa afiseze o valoare sau a variabila, trebuie sa se includa informatia despre tipul variabilei in primul parametru.Pe langa caractere, in primul parametruse poate introducespecificatori de format, care arata functiei printf cum sa afiseze ceilalti parametri. Un specificator de format este reprezentatprin semnul de procent (%) urmat de o litera. De exemplu, pentru a afisa a valoare intreaga, se va folosi %d (d specifica valorile zecimale). De asemenea,pentru a tipari o valoare in virgula mobila , se poate folosi %f .
Prezentarea functiei scanf .
Pentru a introduce date de la tastatura intr-o variabila se foloseste functia scanf.Aceasta functie se foloseste diferit in functie de tipul de date pe care dorim sa-l folosim.
Pentru date de tip numar adica int vom folosi astfel: presupunem ca avem o variabila x care este de tip
int
scanf("%d", &x);
Deci este asemanatoare cu printf, prima data se da un text care contine un simbol special care arata ce fel de variabila se foloseste. %d era folosit si la printf pentru a afisa numere, si aici este folosit pentru a introduce de la tastatura intr-o variabila numere.
Apoi urmeaza un simbol special & si variabila noastra. Deci functia scanf va astepta sa introducem de la tastatura un numar, apoi va pune numarul in variabila x.
Instructiunea conditionala if .
Instructiunea care ne ajuta sa putem sa alegem ce facem se numeste if - in engleza inseamna daca.
Schema de folosire este:
if (conditie) instructiune;
Analiza: O conditie poate sa fie adevarata sau falsa, ea se pune in paranteze. Conditia urmeaza dupa . Apoi urmeaza o instructiune care poate fi orice fel de instructiune normala.
Se intampla urmatorul lucru cand se ajunge la o instructiune if intr-un program:
- se vede daca conditia este adevarata sau falsa
- apoi daca e falsa nu se intampla nimic si se trece mai departe in program
- daca e adevarata conditia atunci se executa instructiunea instructiune instructiune poate fi printf sau scanf sau punem ceva intr-o variabila sau alta instructiune if
Conditiile pot fi niste comparatii intre doua numere sau doua litere sau doua texte sau doua variabile de tip numar, text sau litera.
Pentru ca textul este mai special si trebuie tinut cont de cum este pastrat in memorie, nu
se pot folosi comparatiile standard cu texte.
Comparatiile sunt:
- mai mic: <
- mai mic sau egal: <=
- mai mare: >
- mai mare sau egal: >=
- egalitate: == (doua semne egal unul langa altul)
- diferit: !=
Daca dorim putem sa avem conditii && ( si logic ) combinate cu conditii || ( sau logic ).
Ca sa le putem combina vom folosi paranteze rotunde, si intr-o paranteza rotunda vom pune ori numai && ori numai . Se pot combina intr-o paranteza orice fel de operatii, dar se recomanda folosirea unui singur tip pentru simplitate. Un program foarte complicat cu multe operatii de diferite tipuri fara paranteze se poate scrie echivalent ca un program simplu cu paranteze cu un singur tip intr-o paranteza, deci vom folosi evident ce este mai simplu.
De exmplu
if ( (conditie1 && conditie2) || (conditie3 && conditie 4) ) instructiune;
Analiza: (daca conditie1 SI conditie2 sunt adevarate) SAU (daca conditie3 SI conditie4 sunt
adevarate) atunci se va executa instructiune .
Operatia if else
La if mai putem adauga si else care inseamna altfel.
Daca exista o conditie care se dovedeste adevarata atunci scriem un mesaj altfel scriem alt mesaj.
if (cond) printf("un mesaj");
else printf("alt mesaj);
Instructiunea else trebuie sa urmeze imediat dupa instructiunea if si inseamna altfel decat comparatia din acea instructiune if.
Calcule cu numere
Calculele se fac cu
inseamna plus
inseamna minus
inseamna impartire
inseamna inmultire
Calculele numerice se fac intre numere sau variabile de tip numar si rezultatul se pune intr-o variabila.
Schema:
variabila = (numar sau variabila) operatie (numar sau variabila)
Alte operatii cu numere : daca vrem sa adunam ce este intr-o variabila cu 1 si apoi sa punem rezultatul tot in aceiasi variabila putem scrie astfel:
nr este de tip numar in loc de: nr = nr + 1; putem scrie : nr++; (doi de plus unul langa altul)
daca vrem putem folosi si -- astfel (doi de minus unul langa altul) in loc de: nr = nr - 1;
putem scrie: nr--;
Deci nr-- scade 1 din nr si nr++ adauga 1 la nr
De la operatia ++ vine si numele C++.
Instructiuni repetitive .
Instructiunea while .
Daca vrem sa executam o portiune din program de mai multe ori utilizam while
While in engleza inseamna "in timp ce"
Sintaxa:
while (conditie)
Semantica: Se vor executa instructiunile dintre acolade in timp ce conditia va fi adevarata si se vor repeta mereu pana cand conditia va fi falsa. Daca conditia este din prima falsa, nu se va executa deloc ce este intre acolade.
Instructiunea for .
Sintaxa :
for(initializare contor ; conditie ; incrementare contor )
Daca avem o singura conditie scrisa pentru for atunci acoladele pot sa lipseasca .
Semantica : se initializeaza contorul ( variabila de memorie ) ; cat timp este indeplinita conditia se executa setul de instructiuni si se incrementeaza contorul .
Instructiunea do - while .
Sintaxa :
do
while
Semantica : se executa una sau mai multe instructiuni cel putin o data si apoi daca este necesar , repeta instructiunile .
Instructiunea de alegere switch .
Sintaxa :
switch ( variabila de memorie )
Instructiunea switch permite sa se efectueza o procesare conditionala , cand seria de instructiuni nu se mai potriveste se va executa instructiunea corespunzatoare cazului default .
Utilizarea vectorilor ( tablouri de date ) .
Un vector este o lista de variabile de acelasi tip. De exemplu o lista de variabile intregi sau o lista de variabile text sunt exemple de vectori.
Declararea vectorilor :
tip nume[marime];
Exemplu :
int n , v[100] ;
tip - este tipul de variabile care se afla in lista (int sau char)
nume - este numele dat vectorului (sau numele dat listei de valori)
marime - este numarul maxim de variabile care se poate afla in lista
Deci cu declararea unui vector se arata in program sa se pastreze loc in memorie pentru o lista de variabile de un anumit tip, care poate sa aiba maxim un anumit numar de variabile.
Adresarea unui element al vectorului se realizeaza astfel : v[pozitie] .
Daca intru-un program se utilizeaza vectori atunci obligatoriu avem nevoie de urmatoarele variabile de memorie :
tabloul de elemente ( int v[100] ) .
variabila de memorie ce indica pozitia elementului din vector care se adreseaza ( in general aceasta variabila este i ) .
variabila de memorie ce indica dimensiunea maxima a vectorului si care este de tip intreg , valoarea acestuia fiind mai mica decat dimensiunea tabloului .
Citirea si afisarea elementelor vectorului se face cu o instructiune repetitiva ( de obicei instructiunea for ) .
Exemplu :
#include<stdio.h>
void main ( )
//Afisare vector .
for( i=0 ; i<n ;i++)
printf(" v[%d] = %d , ",i,v[i] ) ;
Utilizarea matricilor .
O matrice reprezinta un tablou de date care are doua dimensiuni reprezentate de numarul de linii si numarul de coloane si se declara astfel:
tip data nume variabila de memorie[diml][dim c] ;
Exemplu :
int a[2][3] ,l, c ;
observatie : primul element al unui tablou de tip matrice se gaseste pe pozitia v[0][0] .
Exemplu de program care utilizeaza matrici :
#include<stdio.h>
void main()
//Suma elementelor matricei.
s=0;
for(i=0;i<l;i++)
for(j=0;j<c;j++)
s=s+mat[i][j];
if(min>mat[i][j]) min=mat[i][j];
//Afisare matrice.
printf('nAfisare matricen');
for(i=0;i<l;i++)
printf('Suma elementelor matricei este : %dn',s);
}
Definirea functiilor utilizator .
Limbajul C contine atat functii predefinite in bibliotecile sistemului cat si functii scrise de catre utilizator .Orice functie intoarce un tip de data . Daca tipul de data este diferit de void , obligatoriu functia trebuie sa contina instructiunea return .
Functiile utilizator se apeleaza in programul principal astfel :
nume functie ( lista parametri efectivi ) si se defineste :
a)-inainte de main astfel :
tip datanume functie ( lista parametri formali )
b)-inainte de main se scrie prototipul functiei .
exemplu :
tip datanume functie( lista parametri formali ); iar dupa main se scrie corpul functiei
Exemplu :
int pozitie( int v[ ] , int dim )
return poz ;
}
O functie recursiva se realizeaza pana cand intilneste punctul de oprire moment in care incepe sa recalculeze pe stiva programului valorile .
Exemplu :
int factorial ( nr )
Siruri de caractere .
Declararea sirurilor .
char nume variabila de memorie [ dimensiunea maxima a sirului ]
exemplu : char s[100];
Diferente intre o variabila sir de caractere si un vector ( tablou ) .
-un vector ( tablou de elemente ) se citeste cu o instructiune repetitiva ( for , while , do-while ) iar citirea unui sir de caractere se realizeaza cu functia get astfel :
cin.get ( s , 100 ) :
-afisarea continutului unui vector se realizeaza cu o instructiune repetitiva in timp ce afisarea unui sir de caractere se realizeaza la fel ca si afisarea oricarei variabile de memorie de tip intreg ( float ) .
printf(" %s ", sir );
-un sir de caractere contine pe ultima pozitie caracterul special nul 0 ce reprezinta terminatorul de sir .
Functii care se utilizeaza pentru sirurile de caractere ;
Obs : functiile sunt definite in fisierul "string.h" .
Citirea unui sir de caractere de la tastatura se realizeaza cu functia get astfel :
cin.get ( s , 100 ) ;
iar pentru citirea unui nou sir de la tastatura trebuie obligatoriu golirea bufferului de tastatura astfel : cin.get ( ) ;
Functii : - strlen ( s ); - primeste de la tastatura un sir de caractere si intoarce intr-o variabila de tip intreg lungimea sirului .
-strcat (s1 , s2 ) ;-primeste ca parametru doua siruri de caractere s1 respectiv s2 si realizeaza concatenarea celor doua siruri , rezultatul fiind pus in primul sir . -strcpy ( s1 , s2 ) ;- primeste ca parametru doua siruri s1 si s2 si copiaza in sirul s1 continutul sirului s2 .
-strcmp ( s1 , s2 ) ; -primeste ca parametru doua siruri de caractere si intoarce valoarea 0 (zero) daca sirurile sunt identice ca continut , o valoare mai mare ca 0(zero) daca s1 > s2 si o valoare mai mica ca 0 (zero) daca s1 < s2 .
Pointeri
Pointerii sunt variabile care contin adresa de memorie a unei alte variabile. Din aceste considerente,
pointerii se numesc si variabile de adresa.
Presupunem ca avem o variabila de tip intreg numita entitate localizata la adresa de memorie 0x1000
(adresele sunt automat asigante variabilelor de catre compilator). Daca dorim sa referim aceasta
variabila prin intermediul unui pointer entitate_ptr, atunci valoarea pointerului va fi 0x1000
(entitate_ptr = 0x1000), astfel spunem ca entitate_ptr 'arata' spre variabila entitate. (Pentru a se evita
confuziile, se recomanda ca numele pointerilor sa aiba sufixul _ptr).
Pointerii se declara punand un asterisc (*) in fata numelui variabilei:
int variabila; /*definire variabila intreg*/
int *variabila_ptr; /*definire pointer la un intreg */
Operatorii specifici pointerilor sunt: operatorul de dereferentiere * (pentru un pointer, returneaza entitatea
referita de pointer) si operatorul de adresa & (pentru o entitate, returneaza adresa entitatii).
Variabila pointer obiect_ptr primeste adresa variabilei obiect, astfel obiect_ptr va indica spre zona de memorie unde este memorata variabila obiect. In ultima linie, se stocheaza valoarea 5 la zona de memorie spre care arata obiect_ptr, adica in variabila obiect.
Folosirea gresita a operatorilor poate duce la functionari incorecte a programului sau, in cazul fericit, la erori semnalate de compilator .
Mai multi pointeri pot indica spre aceeasi zona de memorie:
int obiect;
int *obiect_ptr1;
int *obiect_ptr2;
obiect = 1; /* se atribuie valoarea 1 lui obiect */
obiect_ptr1 = &obiect;
obiect_ptr2 = obiect_ptr1;
Un pointer special definit in limbajul C este pointerul NULL, care nu indica spre nimic (adresa spre care arata acest pointer este 0). Acest pointer este definit in stdio.h si in stdlib.h ca fiind (void *) 0, adica un pointer spre o locatie de tip void si care arata spre locatia de memorie 0.
In C, exista o stransa legatura intre pointeri si tablouri. Cand se foloseste numele unui tablou (fara
index), se genereaza un pointer catre primul element al tabloului. Astfel, in C se pot transmite tablouri
ca parametri in functii (de fapt, se transmite adresa de inceput a tabloului). Alt avantaj al tratarii
unitare pointer-tablou este aplicarea aritmeticii pointerilor pentru accesarea elementelor unui tablou.
Identitate pointer-tablou se reflecta cel mai bine in operatiile cu siruri de caractere, unde sirul de
caractere este un tablou de caractere sau un pointer la caracter.
Limbajul C permite nu doar referirea unor date, ci si referirea functiilor (pointeri la functii). Aceasta
nu difera mult de referirea datelor, un pointer la o functie retinand adresa de memorie unde incepe
rutina care implementeaza functia.
Un pointer la o functie se declara in maniera:
tip_returnat (*nume_pointer)( declaratii parametri );
Astfel, daca avem implementata o functie f1 si un pointer spre functie f1_ptr, secventa urmatoare va
arata cum se poate realiza prin intermediul unui pointer apelul unei functii:
#include <stdio.h>
void f1(int a)
void main(void)
La fel ca in cazul tablourilor, putem atribui direct unui pointer adresa functiei, fara a folosi operatorul
& (f1_ptr=f1; este identic cu f1_ptr=&f1;).
In C, deoarece limbajul ofera o mare libertate de exprimare, este foarte usor pentru un programator
neatent sa faca erori care nu sunt semnalate la compilare, dar care duc la comportari neasteptate ale
programului.
O eroare tipica este atribuirea de valori pointerilor neinitializati:
5
int *un_pointer;
*un_pointer=5;
In aceasta situatie, deoarece un_pointer este neinitializat, valoarea 5 este scrisa in memorie la o locatie
aleatoare, poate chiar rezervata altei variabile. In cazul in care un pointer nu arata spre o zona de memorie rezervata, trebuie alocata o zona de memorie in mod explicit, folosind functia malloc:
un_pointer=(int *)malloc(sizeof(int));
Functia malloc rezerva spatiu de memorie si returneaza adresa spatiului rezervat; zona de memorie
referita de un pointer poate fi eliberata folosind functia free. Ambele functii sunt definite in stdlib.h.
O alta greseala des intalnita este referirea pointerilor spre alte locatii de memorie:
int obiect=5;
int *obiect_ptr;
obiect_ptr = obiect;
Lipsa operatorului de adresa & face ca obiect_ptr sa indice spre locatia de memorie aflata la adresa 5.
Definirea structurilor de date .
O structura reprezinta un tip de variabila de memorie si poate contine elemente de tipuri diferite .
Declararea unei structuri de date se face inainte de main astfel :
struct nume structura
;
In programul principal se declara variabila de memorie de tipul de tipul de data definit de utilizator astfel :
nume structuranume variabila de memorie
Adresarea unui element dintr-o variabila de memorie de tip structura se realizeaza astfel :
nume variabila . componenta
Exemplu :#include<iostream.h.
struct produs
;
void main ( )
Structurile incluse .
Reprezinta structurile care sunt incluse in alte structuri .
Exemplu :
#include< iostream.h >
struct note
;
struct student
;
void main ( )
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2823
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved