Sunteți pe pagina 1din 42

Fundamentele

procedurală

programării

şi programare

Curs 1 Introducere în limbaje de programare

Obiective:

Acest curs are scopul de a forma o privire de ansamblu asupra programării în general şi a programării C în particular.

Limbaje de programare

Limbajul de programare poate fi definit astfel:

O unealtă software ce permite unui programator să scrie comenzi într-un format care poate fi uşor de înţeles şi reţinut de o persoană şi poate fi tradus într-un cod pe care un calculator îl poate înţelege şi executa.

Există foarte multe limbaje de programare El este apropiat de limbajul natural şi de aceea este un excelent mod de a explica un algoritm. Din exemplul de mai sus reiese cu claritate finitudinea algoritmului şi eficacitatea acestuia. Este un algoritm generalizat deoarece este conceput pentru a rezolva orice ecuaţie de gradul I. Pentru a putea fi generalizată, orice soluţie algoritmică are nevoie de a verifica datele din toata plaja posibilă de valori. Algoritmului trebuie să poată accepta date de intrare, de a le prelucra şi de a le afişa ca rezultate. Aceste lucruri nu sunt posibile decât dacă datele pot fi "memorate". Cea mai folosită cale de a memora şi identifica date este aceea de a folosi variabile.

De ce să folosim limbajul C?

Limbajul de programare C în ciuda „vârstei” sale destul de înaintate este şi rămâne un limbaj de succes în rezolvarea oricărei probleme de programare imaginate de cineva, de la programe parte integrantă a sistemelor de operare până la programe de inteligenţă artificială, oferind compilări eficiente pe toate calculatoarele existente de la controlerele roboţilor industriali până la supercalculatoare. Acest succes se datorează folosirii unitare si bine structurate a următoarelor concepte practice:

O varietate mare si puternică de operatori;

O sintaxă elegantă;

Conceptul de biblioteci standard;

O accesibilitate sporită la nivel hardware;

Posibilitatea facilă de a optimiza codul pentru fiecare bucăţică de program în parte

Portabilitate între calculatoare;

C este numit un limbaj de programare „de nivel mediu”. Această etichetă nu este datorată

unei lipse de „putere” a limbajului de programare (din potrivă C este considerat de mulţi ca un limbaj „prea puternic”) ci mai degrabă a posibilitatea de a accesa funcţii de sistem de nivel coborât. Majoritate limbajelor de nivel înalt Pasal, Java etc. presupune faptul că orice ar avea nevoie programul există deja în limbaj. Un limbaj de nivel coborât (de exemplu un limbaj de asamblare) furnizează doar un acces la instrucţiunile de bază ale unităţii centrale. Un limbaj de nivel intermediar ca de exemplu C nu are toate construcţiile găsite în limbajele de nivel înalt dar furnizează un mod de programare suficient de elegant asemănător unui limbaj de nivel înalt oferind pe de altă parte şi unelte operaţii şi facilităţi întâlnite la limbajele de nivel coborât.

Folosirea limbajului C

C a fost folosit la început pentru a dezvolta sisteme de operare. Practic peste 80% din

Linux este scris în C. De ce? Pentru că programul C generat rulează aproape la fel de rapid ca cel scris în limbaj de asamblare, dar modul de scriere al programelor este asemănător cu cel al limbajelor de nivel înalt. Ce fel de programe sunt scrise în C:

Sisteme de operare

Compilatoare de limbaj (compilatoarele de C dar nu numai sunt de obicei scrise in C)

Asambloare

Editoare de text

Drivere de reţea

Baze de date sau programe care gestionează baze de date

Interpretoare de comenzi

Programe utilitare

etc. Popularitate limbajului C a făcut ca alte limbaje de programare moderne sa fie „inspirate” din C ca funcţionalitate sau sintaxă; dintre acestea aş aminti Java şi php dar sunt multe altele.

Istoric

C este un limbaj de uz general, care este asociat de sistemul de operare UNIX (din care a

derivat apoi şi Linux), sistem care foloseşte intensiv acest limbaj fiind în foarte mare măsură scris în C. Ideile din limbajul C au fost preluate din limbajul BCPL, dezvoltat de Martin Richards. Fiind precedat de limbajul B scris de Ken Thompson în 1970 la Bell Labs, pentru primul sistem UNIX pe calculatore DEC PDP-7. În 1972 Dennis Ritchie de la Bell Labs scrie limbajul C şi în 1978 publică „The C Programming Language” de Kernighan & Ritchie având ca rezultat ă revoluţie în lumea calculatoarelor. În 1983, American National Standards Institute (ANSI Institutul Naţional de Standarde American) stabileşte o definire clară a termenelor pentru limbajul C, rezultatul fiind definirea standardului ANSI pentru C supranumit "ANSI C", care apoi a fost completat în 1988.

Curs 2 Noţiunea de algoritm

Def.1. Un algoritm este o succesiune de paşi finită, cu punct unic de intrare şi de ieşire, care conduce într-un timp finit la rezolvarea unei clase de probleme.

Def2. Algoritmul este un mod prin care o transformare este descrisa sistematic şi condiţional în desfăşurarea sa.

Transformarea impune de obicei folosirea unor valori numite date de intrare sau parametrii de intrare pe care algoritmul le transformă în rezultate sau date de ieşire. Algoritmii au următoarele caracteristici:

Date

de
de

intrare

Algoritm

Date

de
de

ieşire

generalizare: adică sunt concepuţi pentru a rezolva cu succes mai multe probleme care au o cale de rezolvare asemănătoare

determinism: adică obţinerea de rezultate identice pentru valori de intrare identice

finitudine: procesul de prelucrare se termină după un număr finit de paşi; (există cazuri în care programele scrise nu respectă această condiţie ceea ce conduce la buclă infinită)

claritate: toate acţiunile sau condiţionările din algoritm sunt clar specificate

Exemplu1:

Rezolvarea unei ecuaţii de gradul I. Analiza problemei: Forma generala a unei ecuaţii de gradul I este ax+b=0. Date de intrare: a şi b. Date de ieşire: rădăcina calculata x a ecuaţiei sau un mesaj ("nu exista soluţie" sau "Există o infinitate de soluţii") Procesul prelucrării datelor de intrare poate fi descris astfel:

PAS 1. Se citesc valorile coeficienţilor a, b; PAS 2. Dacă a=0 şi b=0 atunci se afişează "Există o infinitate de soluţii"; PAS 3. Dacă a=0 şi b<>0 atunci se afişează "nu exista soluţie"; PAS 4. Dacă a<>0 atunci soluţia este x=-b/a; PAS 5. Afişează valoarea lui x;

Pentru a reprezenta un algoritm putem alege orice model care repezită dezideratele arătate mai sus. Algoritmul din exemplul anterior a fost reprezentat prin pseudocod.

Pseudocodul este un mod de a descrie liber (fără îngrădiri) a unui algoritm.

El este apropiat de limbajul natural şi de aceea este un excelent mod de a explica un algoritm. Din exemplul de mai sus reiese cu claritate finitudinea algoritmului şi eficacitatea acestuia. Este un algoritm generalizat deoarece este conceput pentru a rezolva orice ecuaţie de gradul I. Pentru a putea fi generalizată, orice soluţie algoritmică are nevoie de a verifica datele din toata plaja posibilă de valori. Algoritmului trebuie să poată accepta date de intrare, de a le prelucra şi de a le afişa ca rezultate. Aceste lucruri nu sunt posibile decât dacă datele pot fi "memorate". Cea mai folosită cale de a memora şi identifica date este aceea de a folosi variabile.

O variabilă este o zonă identificabilă de memorie a cărei valoare poate fi modificată prin acţiunile algoritmului.

Caracteristicile variabilelor sunt

identificarea de obicei realizată printr-un nume (format dintr-o înşiruire de litere şi cifre). Numele unei variabile dacă există se numeşte identificator;

tip de date. Este indicat ca să se cunoască ce fel de date vor fi memorate de către variabilă. Unele limbaje de programare (în special interpretoarele) admit existenţa unui tip de date variabil adică variabila poate în perioada sa de definiţie să-şi modifice tipul.

zonă de memorie care va conţine valoarea la un moment dat a variabilei. Dimensiunea

rezervată pentru o variabilă este de obicei în funcţie de tipul de dată pe care îl conţine. Localizarea exactă a zonei de memorie este de obicei cunoscută doar în momentul execuţiei programului. Variabila îşi poate schimba valoarea pe parcursul parcurgerii algoritmului, dar la un moment dat o variabilă nu poate avea decât o singură valoare. Valoarea variabilei poate fi utilizata de către algoritm prin intermediul numelui: oriunde apare numele unei variabile se înţelege de fapt valoarea pe care aceasta o are la momentul respectiv.

Prin tip de date se înţelege gruparea datelor asemănătoare ca domeniu de definiţie sub un nume numit identificator de tip de date.

În general, tipurile de date utilizate în informatica sunt submulţimi ale mulţimilor cunoscute din matematica. Limitarea plajei de valori este datorată caracterului finit al zonei de memorie folosite memorare. De exemplu, în limbajul C++ sunt utilizate, printre altele, următoarele tipuri:

int: valori întregi intre -32767 şi 32768 (memorare pe 2octeţi); long int: valori întregi intre -2147483648 şi 2147483647 (memorare pe 4octeţi)

Obs. Compilatoarele C moderne memorează tipul int pe 4 octeţi, iar un întreg cu semn reprezentat pe 2 octeţi se numeşte short int.

Unii autori considera inclusă în definiţia tipului de date şi mulţimea operatorilor şi funcţiilor care se pot aplica elementelor tipului respectiv. De exemplu, pentru un tip întreg, exista operaţii specifice: împărţirea întreagă şi modul aritmetic (restul împărţirii întregi).

Prin constantă înţelegem o valoare fixă, care nu se modifică de-a lungul aplicării unui algoritm.

Constantele se reprezintă uzual printr-o valoare efectiva:

3, -2, -123, 9452 sunt constante întregi 3.456, 2.000, 3.4000E+10 sunt constante reale 'a', 'B', '&' sunt constante de tip caracter

'ecuaţia are o infinitate de soluţii !' este o constanta şir de caractere

Modalităţi de reprezentare a algoritmilor

Schema logică

Cea mai utilizata metoda de scriere a algoritmilor, cel puţin pentru începătorii în programare, este aceea a utilizării schemelor logice, care descriu operaţiile ce pot fi aplicate datelor prin simboluri grafice numite blocuri. Sunt utilizate următoarele blocuri:

START

STOP

1.Blocul START:

Este blocul care indica începutul oricărei scheme logice şi este folosit o singura dată (orice schema logica are un început unic).

2.Blocul STOP Este blocul care încheie schema logica şi este, de asemenea, unic.

3.Blocul de citire Blocul de citire corespunde operaţiei de introducere a datelor, în timpul căreia se aşteaptă ca utilizatorul să introducă valori concrete, ce vor fi stocate în zona de memorie alocata variabilelor prezente după comanda CITEŞTE. Cu alte cuvinte, pentru fiecare variabila al cărui

nume este precizat în blocul de citire se cere introducerea unei valori.

CITEŞTE
CITEŞTE

4. Blocul de scriere

SCRIE

unei valori. CITEŞTE 4. Blocul de scriere SCRIE 5.Blocul de calcul Blocul de scriere corespunde operatei

5.Blocul de calcul

CITEŞTE 4. Blocul de scriere SCRIE 5.Blocul de calcul Blocul de scriere corespunde operatei de afi
CITEŞTE 4. Blocul de scriere SCRIE 5.Blocul de calcul Blocul de scriere corespunde operatei de afi

Blocul de scriere corespunde operatei de afişare a valorii unei variabile sau a unui mesaj. După comanda SCRIE se precizează o lista cu numele variabilelor a căror valoare va fi afişată şi a mesajelor.

variabila expresie

Blocul de calcul corespunde operaţiei numite atribuire, care are ca efect calcularea valorii expresiei şi memorarea valorii obţinute în zona de memorie alocata variabilei var. Schimbarea valorii unei variabile se poate realiza fie prin utilizarea unei atribuiri, fie prin citirea valorii prin intermediul unei operaţii de citire. Există şi un bloc de calcul de forma care indică o acţiune complexă (grafic indicat prin dublarea marginilor laterale), de obicei o procedură. Uzual informaţiile din blocul de calcul sunt sub forma unor atribuiri variabila expresie care se traduc prin modificarea valorii variabilei cu valoarea dată de calculul expresiei.

Nu

C Da

Nu

C

Da

6. Blocul de decizie

Blocul de decizie evaluează valoarea de adevăr a condiţiei C şi, dacă aceasta este adevărata se trece pe ramura DA, iar dacă este falsă pe ramura NU. 6. Conectori Conectarea blocurilor ce formează o schema logica se realizează cu ajutorul unor săgeţi, acestea indicând şi sensul de efectuare a operaţiilor ce compun schema logică.

De asemenea, pentru a putea reuni mai multe săgeţi se folosesc cerculeţe. Cerculeţele mici fără text încorporat au rolul de a uni estetic mai multe linii (conectori). Cerculeţele mai mari

având încorporate de obicei o literă din alfabetul grecesc pot

avea rolul de a indica o continuare a schemei logice pe o altă pagină sau se folosesc pentru a elimina săgeţile lungi inestetice.

α α
α
α

Scheme logice structurate

Schema logică poate fi definită ca o succesiune de blocuri de tipurile prezentate mai sus, cu următoarele caracteristici:

a. conţine un singur bloc Start şi un singur bloc Stop;

b. în fiecare bloc intra o singura săgeata şi, cu excepţia blocului de decizie, iese o singura

săgeata (blocurile au o singura intrare şi o singura ieşire)

c. exista cel puţin un “traseu” ce pleacă din blocul Start şi mergând în sensul săgeţilor se

ajunge în blocul Stop;

secvenţa

A1

A2

Execuţie

condiţionată simplă

Nu

C

Da

A

Execuţie

condiţionată

completă

Nu

A2

C Da

A1

d. blocul de decizie poate conţine, pe cele doua ramuri, orice combinaţie de blocuri dintre cele prezentate;

O schema logica ce are aceste proprietăţi reprezintă un algoritm

structurat.

Sunt posibile următoarele combinaţii de operaţii ce descriu tipuri de scheme logice structurate:

1. Secvenţa înseamnă de fapt două sau mai multe acţiuni care se vor desfăşura una în

continuarea celeilalte (adică acţiunea A2 se va realiza doar după încheierea acţiunii A1)

2. Execuţii condiţionate. Ele sunt de două feluri. Simplă, în cazul în care acţiunea apare doar

pe ramura Da, respectiv completă, în cazul în care apar acţiuni pe ambele ramuri ale condiţiei

C.

Condiţia simpla se exprimă prin:

VOCABULARUL (LEXICUL): mulţime de cuvinte acceptate ca făcând parte din limbaj Se numeşte UNITATE LEXICALA cea mai mica "îmbinare" de caractere din vocabular, care are un înţeles.

Dacă C atunci A

Exista un set de reguli privind combinarea unităţilor lexicale în cuvinte şi a cuvintelor în "fraze" (reguli de SINTAXA), respectarea regulilor ducând la obţinerea unor construcţii corecte. SEMANTICA unui limbaj se refera la înţelesul structurilor obţinute prin combinarea cuvintelor acceptate de limbaj. În vocabular avem:

sau în engleză

If C then A

iar cea completă se exprimă prin

Dacă C atunci A1 altfel A2

sau în engleză

If C then A1 else A2

 

Buclă cu

 

Buclă cu

test iniţial

test final

 

Da

A

C

Nu

A

C

Da

iar cea cu test final se

Nu

Nu

 

execută

A

atât

sau în engleză

3. Bucle, care se folosesc pentru execuţia repetată

a unei acţiuni până în momentul în care condiţia devine falsă. Există două tipuri de bucle, cu test iniţial în care secvenţa este test-acţiune, si bucle cu test final în care secvenţa este de tip acţiune-test

Bucla cu test iniţial se exprimă prin:

atât timp cât C execută A

sau în engleză

while C do A

exprimă prin

timp cât C

do A while C

Să revenim puţin asupra operaţiei de atribuire, operaţie care se efectuează într-un bloc de calcul şi care implică definirea mai multor termeni:

Prezentarea generală a noţiunii de limbaj de programare

Am văzut în secţiunea precedenta cum pot fi reprezentaţi algoritmii prin utilizarea pseudocodului sau a schemelor logice, insă prelucrarea automata a datelor presupune scrierea algoritmului intr-o forma ce poate fi înţeleasă de calculatorul electronic. Algoritmii vor fi scrişi intr-un “limbaj de programare”, care va conţine operaţii asemănătoare celor despre care am amintit, numite acum instrucţiuni. Limbajul de programare conţine:

ALFABETUL: o mulţime de simboluri pentru scrierea cuvintelor din limbaj.

Majoritatea limbajelor de programare folosesc alfabetul latin specific limbii engleze, cifre arabe, simboluri matematice etc. organizate sub forma unei codificări ASCII. Codificarea ASCII este de fapt o echivalarea a fiecărui simbol uzual folosit cu o valoare numerică (iniţial în intervalul [0, 127]). Înţelegerea acestei codificări de altfel intens folosită nu numai în programare este fundamentală în a înţelege modul în care se memorează datele în calculator.

cuvinte cheie = cuvinte sau prescurtări ale unor cuvinte din limba engleza, ce reprezintă elemente de limbaj participând la crearea unor construcţii sintactic corecte (de exemplu comenzi sau instrucţiuni).

Cuvintele cheie sunt tratate diferit de restul textului din program de aceea ele trebuie cunoscute şi folosite doar în modul şi locul în care ele au fost definite.

identificatori = nume folosite pentru variabile, tipuri de date şi funcţii definite de utilizator.

Un identificator este format dintr-un şir de caractere care începe cu o litera şi poate conţine

litere, cifre şi caracterul "_" (underscore). Identificatorul, în funcţie de limbajul în care este

folosit nu poate conţine în general spatii sau apostrof, virgula, ghilimele pot coincide cu cuvintele cheie.

Identificatorii nu

Prin PROGRAM se înţelege o succesiune de comenzi(instrucţiuni) de prelucrare a datelor, scrise intr-un limbaj de programare.

Programul este memorat intr-o entitate numita fişier sursa (este un fişier text). Prelucrările dintr-un program C++ sunt grupate în FUNCŢII. Rezolvarea unei probleme se face prin utilizarea unor funcţii definite în limbaj şi / sau a unor funcţii scrise de programator, atunci când funcţiile deja existente nu sunt suficiente. Funcţiile pe care limbajul le pune la dispoziţia utilizatorului sunt grupate, după tipul de prelucrare oferit, în mai multe fişiere numite "biblioteci" (fişiere HEADER). Pentru a putea utiliza o funcţie trebuie să se specifice la începutul programului numele bibliotecii care conţine funcţia respectiva. Orice program C++ trebuie să conţină o funcţie numita "main" (un fel de “program principal”), instrucţiunile conţinute de aceasta fiind cele prelucrate atunci când programul este lansat în execuţie. Pentru a se putea obţine rezultatele prelucrării datelor cu ajutorul programelor, trebuiesc parcurse următoarele faze:

scrierea programului (editarea textului sursa);

compilarea programului (=verificarea corectitudinii sintactice şi semantice a textului sursa

şi prelucrarea sa fişier obiect)

editarea legăturilor (fişierul / fişierele obiect obţinute în urma compilării sunt transformate

intr-un fişier executabil, adică într-un fişier care poate fi lansat în execuţie prin simpla scriere a numelui sau la prompt-ul sistemului de operare;

Numim mediu de programare un program care permite asistarea programatorului în toate fazele de elaborare a unui program, scris intr-un limbaj de programare (editare, depanare, compilare, execuţie).

În paragraful următor vor fi prezentate elementele de baza ale limbajului C.

Prezentarea generala a limbajului C++

Alfabetul

Alfabetul limbajului este format din acele simboluri utilizate la reprezentarea entităţilor unui program, adică a unitarilor lexicale.

Reamintim ca, prin unităţi lexicale înţelegem cele mai mici entităţi cu valoare semantica (adică au o semnificaţie), prin combinarea cărora rezulta construcţiile sintactice ("propoziţii şi fraze"). Alfabetul limbajului C se compune din următoarele categorii de simboluri:

(eng.

Literele

mari

şi

mici

ale

alfabetului

englez

şi caracterul de

subliniere

"_"

underscore)

Cifrele arabe: 0-9

Semne de punctuaţie: ; , ‘ "

Alte caractere:

+, -, *, / (, ), {, }, [, ], \, ~, ^, <, >, =, ?, !, #, &, Literele şi cifrele, precum şi caracterul underscore, de multe ori asimilat în mulţimea literelor, sunt utilizate pentru construirea identificatorilor şi cuvintelor cheie, după reguli ce vor fi descrise în paragrafele corespunzătoare. În limbajul C se face diferenţa dintre literele mici şi majusculele corespunzătoare, deci identificatorul "a" va fi diferit de identificatorul "A".

Identificatori

pe care le

funcţiilor, tipurilor de date definite de utilizator.

Identificatorul

reprezintă

nume

atribuim

variabilelor,

constantelor,

Un identificator este o secvenţa de litere, cifre şi caracterul underscore, primul caracter trebuind să fie litera sau underscore. Folosiţi cu multa precauţie identificatori care încep cu underscore, pentru a nu intra în conflict cu numele rutinelor sistem, a căror ortografiere nu se cunoaşte (numele rutinelor sistem încep întotdeauna cu "_"). Regulile de formare a identificatorilor sunt aceleaşi cu regulile din Pascal. Un identificator poate avea, teoretic, o lungime arbitrara, dar în general doar primele 31 de caractere sunt luate în considerare de compilator (iarăşi depinde de compilator). Compilatorul de C face distincţie între literele mici şi cele mari din numele identificatorilor (eng case sensitive) astfel că identificatorii următori sunt toţi diferiţi între ei:

nume, Nume, NuME, NUMe

Exemple (virgula are rol de separare):

i, j, abc, tablouDeCaractere, tablou_de_caractere, _, _1,

Cuvinte rezervate (eng. keywords)

Numele rezervate instrucţiunilor, tipurilor predefinite şi sintaxei de definire a funcţiilor şi tipurilor de date se numesc cuvinte cheie.

Lista cuvintelor cheie ale limbajului C depinde de tipul de compilator folosit mediul Borland C++ este:

pentru

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

Identificatorii definiţi de utilizator nu trebuie să coincidă cu cuvintele rezervate. În limbajul C++ se mai adaugă câteva cuvinte cheie, care vor fi descrise la momentul oportun (în capitolul rezervat programării orientate obiect).

Comentarii

Comentariile sunt acele şiruri de caractere utilizate la explicarea programelor sursa, delimitate prin caractere speciale care determina ignorarea lor de către compilator.

Un comentariu este o construcţie de forma /* */ ca de exemplu:

/* şir de caractere */ sau de forma // … ca de exemplu:

// şir de caractere comentariu până la sfârşit de linie unde prin şir de caractere se înţelege o secvenţa de caractere din setul caracterelor reprezentabile, mai puţin combinaţia */. Nu se admit comentariile imbricate (adică un comentariu în alt comentariu). Comentariul poate fi scris pe mai multe linii dacă este scris în prima formă. A doua formă este specifică pentru C++ şi permite scrierea unor comentarii ce nu depăşesc o linie.

Tipuri de date

Definiţia noţiunii de tip de dată cuprinde, pe lângă mulţimea de valori a tipului, şi alte aspecte:

dimensiunea memoriei alocate

mulţimea operaţiilor ce acţionează asupra elementelor tipului

timpul de viata asociat datei, dat de clasa de memorie Aceste tipuri de date le vom folosi în continuare deoarece acesta defineşte o foarte importantă proprietate a constantelor cât şi a variabilelor folosite în programare. Tipurile de date sunt:

tipuri de baza: tipuri predefinite în limbaj;

o

caracter (char) - memorează un singur caracter scris în codificare ASCII (memorare pe 1octet) – pentru C tipul char poate fi de asemenea asimilat unui tip întreg de dimensiunea unui octet.

o

diferite variante de tipuri întregi întreg (int), care vor memora date întregi având de la valori în intervalul [32767, 32768] (memorare pe 2octeţi) până la valori memorate pe 4 octeţi.

o

real (float, double, long double) folosite pentru a memora valori raţionale ân limite foate largi de reprezentare, unde precizia (numărul de cifre posibil de reprezentat( devine de asemenea importantă.

tipuri derivate: tipuri definite de utilizator;

o

enumerare

o

referinţa

o

structurate:

o

tablou

o

structura

o

uniune

Tipuri de date predefinite

Tipurile de baza definite în limbajul C sunt: întreg, real şi caracter. Exista insa mai multe tipuri întregi şi reale, în funcţie de numărul de biţi pe care se pot memora valorile şi dacă valorile sunt cu sau fără semn. În plus, unele dintre aceste tipuri diferă de la o implementare la alta a limbajului (în funcţie de calculatorul pe care se lucrează). În tabelul următor sunt prezentate tipurile fundamentale, memoria necesara stocării valorilor de acel tip şi limita valorilor ce pot fi memorate intr-o variabilă de acel tip.

Tipuri de date întregi

 

Tipuri întregi de date

 

Tipul

 

Dimensiune

 

Tip

Limita valorilor definită mai clar de <limits.h>

memorie

reprezentare

char

1 Octet (Byte)

Complement

faţă

[-128,127] sau [0, 255]

de

2

sau

întreg

[CHAR_MIN,CHAR_MAX]

fără

semn.

 

Identifică

un

caracter ASCII

signed char

1 Octet (Byte)

 

[-128,127] sau

[SCHAR_MIN,SCHAR_MAX]

unsigned char

1

Octet

întreg fără semn

[0, 255] sau

 

[UCHAR_MIN,UCHAR_MAX]

int

depinde

de

complement

faţă

[-32768,32767] sau

implementare

de 2

[-2147483648,2147483647]

(pentru

 

[INT_MIN , INT_MAX]

compilatoarele

 

vechi

2octeţi

pentru

cele

moderne 4octeţi)

short int

2

Octeţi

complement

faţă

[-32768,32767] sau

 

de 2

[SHRT_MIN, SHRT_MAX]

signed short int

2

Octeţi

complement

faţă

[-32768,32767] sau

 

de 2

[SHRT_MIN, SHRT_MAX]

unsigned

short

2

Octeţi

întreg fără semn

[0, 65535] sau

int

 

[USHRT_MIN, USHRT_MAX]

unsigned int

depinde

de

întreg fără semn

[0, 65535] sau [0, 4294967295]

implementare

[UINT_MIN, UINT_MAX]

2

sau 4 octeţi

 

long long int signed long signed long int

4

Octeţi

complement

faţă

[-2147483648,2147483647]

 

de 2

[LONG_MIN , LONG_MAX]

 

unsigned long

4

Octeţi

întreg fără semn

[0,4294967295]

unsigned

long

 

[ULONG_MIN, ULONG_MAX]

int

 

Primul tip este tipul caracter. O variabila de acest tip va avea ca valoare codul ASCII asociat caracterului respectiv. De exemplu, dacă unei variabile i se atribuie caracterul ’a’, variabila va conţine valoarea 97 (numărul de ordine al caracterului ’a’ în codul ASCII). Tipul întreg cel mai des utilizat în programe este int, dar numărul de Byte (octeţi) pe care se memorează valorile de acest tip diferă de la o implementare la alta a limbajului C (în funcţie de tipul calculatorului). Astfel, tipul int este echivalent cu short int sau long int, în funcţie de implementare. Celelalte tipuri întregi sunt obţinute prin folosirea prefixului signed sau unsigned, indicând dacă valorile respective sunt cu semn (conţin şi valori negative), respectiv fără semn ( valori naturale). Exemplu: Un program C pentru a identifica tipurile de date folosite de compilatorul curent

#include <stdio.h> #include <limits.h>

volatile int char_min = CHAR_MIN;

int main(void){ printf("\n\n\n\n\n

Tipuri Caracter\n");

printf("Numărul de biti pt un caracter: %d\n", CHAR_BIT); printf("Dimensiunea caracterului este: %d byte\n", int)sizeof(char)); printf("Signed char: [%d,%d]\n", SCHAR_MIN, SCHAR_MAX); printf("Unsigned char: [0,%u]\n", (unsigned int)UCHAR_MAX);

printf("Implicit char este: "); if (char_min < 0) printf("signed\n"); else if (char_min == 0) printf("unsigned\n");

else

printf("non-standard\n");

printf("\n

printf("Dimensiune short int: %d bytes\n", (int)sizeof(short)); printf("Signed short min: [%d,%d]\n",SHRT_MIN, SHRT_MAX); printf("Unsigned short min: [0,%d]\n", (unsigned int)USHRT_MAX);

Tipuri short\n");

printf("\n

printf("Dimensiunea pentru int: %d bytes\n", (int)sizeof(int));

Tipuri Int \n");

printf("Signed int: [%d,%d]\n",INT_MIN, INT_MAX); printf("Unsigned int [0,%u]\n",(unsigned int)UINT_MAX);

}

printf("\n

printf("Dimensiunea pentru long int: %d bytes\n", (int)sizeof(long)); printf("Signed long: [%ld,%ld]\n",LONG_MIN, LONG_MAX); printf("Unsigned long: [0,%lu]\n",ULONG_MAX);

Tipuri Long Int\n");

return 0;

Din tabel se observa ca nu exista un tip logic, aşa cum este el definit în alte limbaje de programare. În limbajul Pascal, tipul logic (BOOLEAN) e definit ca mulţimea cu valorile {False, True} împreuna cu operatorii logici cunoscuţi (şi, sau , negaţia logica). În limbajul C nu s-a definit acest tip dar se foloseşte următoarea convenţie: o expresie este considerată adevărată dacă valoarea obţinuta la evaluarea ei este nenulă (are o valoare diferită de 0 exprimată prin valoarea 1) şi falsă (are valoarea 0) în caz contrar. Variabilele care se vor folosi ca variabile logice vor fi declarate de tip întreg. Tipul char se foloseşte în C pentru a identifica fie o valoare de reprezentare a unui caracter ASCII fie pentru a reprezenta o valoare întreagă cu un domeniu de valori foarte mic (256 valori diferite reprezentate pe 1Byte sau Octet).Tipul char diferă de tipul caracter din Pascal (unde caracterele nu se „amestecă” cu valorile întregi), în C caracterele fiind de fapt întregi, care desemnează codul ASCII corespunzător.

Complement faţă de 2

Complementul faţă de 2 reprezintă o modalitate foarte folosită pentru a reprezenta valori cu semn în memorie. Pentru a face o reprezentare a unor numere cu semn în memoria calculatorului trebuie să pornim de la următoarele premize:

în calculator se poate reprezenta un număr finit de valori într-o zonă de memorie de dimensiune prestabilită. Regula este că într-un spaţiu de memorie având x buţi vom putea reprezenta 2 x (2 la puterea x) valori distincte. Astfel pe 8 biţi reprezentăm 2 8 =256 valori, pe 16biţi 2 16 =65536 valori etc.

dacă vom dori reprezentarea unor date cu semn atunci trebuie să alocăm jumătate din spaţiul de reprezentat pentru valorile pozitive şi jumătate pentru cele negative

semnul de reprezentare (pozitiv sau negativ) trebuie să fie cunoscut

calculele realizate cu valorile memorate trebuie sa fie cât mai simple.

Modalitatea de reprezentare a datelor cu semn la care s-a ajuns şi este foarte cunoscută se numeşte complement faţă de 2. Această modalitate de memorare foloseşte următoarele reguli:

primul bit din reprezentare se numeşte bitul de semn şi prin convenţie bitul de semn are valoarea 0 pentru numere pozitive şi 1 pentru cele negative

valorile pozitive sunt memorate ca şi valori direct obţinute ca transformări în baza 2 a valorilor date cadrate la dreapta şi completate cu zerouri nesemnificative în partea stângă

valorile negative sunt obţinute din cele pozitive fiind rezultatul scăderii valorii pozitive din reprezentarea valorii zero (vezi exemplele de mai jos).

Exemple: pentru simplitate voi considera o reprezentare a datelor pe un octet (altfel spus pe 8 biţi) cu semn. O reprezentare a datelor pe 16biţi, 32 de biţi etc. se realizează simulat cu cea descrisă de exemplele mele numai că numărul de biţi diferă.

Valoare de

Echivalent

   
   

reprezentat

Hexazecimal de la 00 la ff

Octal de la 000 la 377

Reprezentare

 

Observaţii

 

0

00

000

0

0

0

0

0

0

0

0

0 este un număr pozitiv deoarece are bitul semn 0

 

1

01

001

0

0

0

0

0

0

0

1

Valorile se cadrează la dreapta

 

10

0a

012

0

0

0

0

1

0

1

0

 

127

7f

177

0

1

1

1

1

1

1

1

cea mai mare valoare pozitivă

 

-1

Ff

377

1

1

1

1

1

1

1

1

Se obţine scăzând 1 din reprezentarea lui 0

   

0

0

0

0

0

0

0

0-

 

0

0

0

0

0

0

0

1

1

1

1

1

1

1

1

1

-128

80

200

1

0

0

0

0

0

0

0

Reprezentarea celei mai mici valori negative

Avantajul reprezentării în complement faţă de doi a valorilor întregi cu semn este acela că operaţiile aritmetice pentru valorile cu semn faţă de cele fără semn sunt identice (abstracţie făcând de faptul că apar „depăşiri” de reprezentare prin transporturi dincolo de prima cifră a reprezentării).

Tipuri de date reale

Tipuri reale de date conform standardului IEEE 754 (mantisă şi exponent)

Tipul

Dimensiune

Limite de reprezentare

Precizie în cifre semnificative

memorie

float

4

Octeţi

[1.175494*10 -38 , 3.402823*10 +38 ]

7

double

8

Octeţi

[2.225073*10 -308 , 1.7976931*10 +308 ]

15

long double

10 Octeţi

[3.37*10 -4932 , 1.18*10 +4932 ]

19

Ultimele trei tipuri din tabel sunt tipuri reale, diferenţa dintre ele constând în cantitatea de memorie utilizata, intervalul de valori şi precizia memorării valorilor (numărul de zecimale reţinute). Valorile reale se reprezintă conform notaţiei din standardul IEEE 754 (folosind semnul, mantisa şi exponentul). De exemplu, pentru tipul float se utilizează reprezentarea în simpla precizie, folosind un bit de semn, 7 biţi pentru exponent şi 24 de biţi pentru mantisa. Aceasta reprezentare are un exponent în limita a 10 -37 şi 10 38 cu 6 - 7 zecimale precizie. Pentru mai multe detalii referitoare la modul de memorare a datelor reale consultaţi subcapitolul constante reale.

Tipul de date void

O alta caracteristica aparte o constituie introducerea tipului void, pentru a desemna

“nimic” sau “orice tip”, în funcţie de contextul în care este utilizat. În exemplele de până acum

tipul void a fost folosit pentru a indica faptul ca funcţia main nu întoarce nici o valoare.

Constante

O constantă este (de fapt ca şi o variabilă) o zonă de memorie care are un tip şi o valoare.

Spre deosebire de variabilă valoarea unei constante nu se poate modifica în timpul execuţiei

programului. Tipul constantei ca şi valoarea sunt determinate de modul în care această constantă a fost scrisă. Există mai multe tipuri de constante dintre care amintim:

Constante întregi

Constante flotante

Constante caracter

Constante şir de caractere

Constante întregi

Noi suntem obişnuiţi cu sistemul de numeraţie zecimal, adică folosim zece simboluri prin care exprimăm valorile numerice (cifrele de la 0 la 9). Calculatorul, din motive tehnice lucrează în binar (foloseşte doar valorile 0 şi 1) pentru a reprezenta valorile. Valorile binare sunt destul de greu de memorat şi folosit, de aceea programatorii folosesc frecvent reprezentarea în octal (baza 8) sau hexazecimal (baza 16) a datelor. Limbajul C fiind mai apropiat ca alte limbaje de codul maşină şi fiind folosit pentru a descrie sisteme de operare permite utilizarea nu numai a valorilor scrise zecimal dar şi octal sau hexazecimal.

O constantă întreagă zecimală cu semn se scrie în C fără nici un prefix sau sufix.

Constantele sunt reprezentate fie pe 16 biţi (dacă valoarea variabilei este în intervalul de

reprezentare a unei valori de tip short int adică [-32768,32767], sau reprezentare pe 32 de biţi dacă fie depăşeşte intervalul de definire pentru short int (dar valoarea ei este in intervalul unui long int [-2147483648, 2147483647]) sau valoarea este postfixată cu caracterul L sau l (de exemplu 12345678, 23l sau 123L).

O constantă întreagă zecimală fără semn se scrie în C folosind sufixul u sau U.

Constantele sunt reprezentate fie pe 16 biţi (dacă valoarea variabilei este în intervalul de reprezentare a unei valori de tip unsigned short int adică [0,65535], sau reprezentare

pe 32 de biţi dacă fie depăşeşte intervalul de definire pentru unsigned short int (dar

valoarea ei este in intervalul unui long int [0, 4294967295]) sau valoarea este postfixată de caracterele ul, lu, UL, sau LU (de exemplu 12345678u, 23ul sau 123LU).

O constantă întreagă octală este o valoare fără semn scrisă în baza 8 (o succesiune de cifre

de la 0 la 7) începând obligatoriu cu valoarea 0 (zero). De exemplu 0123 este o constantă octală iar 123 este o constantă zecimală. Ca şi constanta zecimală, constanta octală poate fi reprezentată pe 16biţi sau (dacă are o valoare mare sau este postfixată cu litera l sau L) pe

32de biţi.

Exemple:

Constanta

Tip constantă

Tip dată

Reprezentare binară

 

întreagă

 

12

zecimală cu semn

short int

 

0

0

0

0

0

0

0

0

0

0

0

0

 

1 0

1 0

   

12u

zecimală fără semn

unsigned

 

0

0

0

0

0

0

0

0

0

0

0

0

 

1 0

1 0

   

short int

 

12ul

Zecimală fără semn

unsigned

00000000000000000000000000011000
00000000000000000000000000011000

long int

 

50000

zecimală cu semn

long

int

0

0000000000000001100001101010000
0000000000000001100001101010000

(deoarece

 

depăşeşte

reprezentar

ea

de

16biţi)

50000u

zecimală fără semn

unsigned

00000000000000001100001101010000
00000000000000001100001101010000

long int

 

-13

zecimală cu semn

unsigned

 

1

1

1

1

1

1

1

1

1

1

1

1

0

0

1

1

 

short int

 

-13u

eronat deoarece nu se pot reprezenta numere negative

eronat

 

-192

eronat deoarece 9 nu este o cifră octală

eronat

 

012

Octală fără semn

unsigned

 

0

0

0

0

0

0

0

0

0

0

0

0

1

0

1

0

 

short int

 

-012

eronat deoarece nu se pot reprezenta numere negative

eronat

 

0x12

hexazecimală

fără

unsigned

 

0

0

0

0

0

0

0

0

0

0

0

1

0

0

1

0

 

semn

short int

 

0xaa2b

hexazecimală

fără

unsigned

 

1

1

0

0

1

1

0

0

0

0

1

0

1

1

0

1

 

semn

short int

 

0XAbCdE

hexazecimală

fără

unsigned

00000000000101010111100110111100
00000000000101010111100110111100

semn

long int

 

-0x12

eronat deoarece nu se pot reprezenta hexazecimal numere negative

eronat

 

Constante flotante

O constantă flotantă se foloseşte pentru a reprezenta un număr raţional şi este compusă din maxim trei componente plus eventual un indicator de tip:

parte întreagă – o constantă zecimală

parte fracţionară – un indicator separator de parte zecimală (reprezentat printr-un punct zecimal) urmat eventual de mai multe cifre zecimale

exponent – un indicator de exponent (litera e sau E), urmată de o valoare zecimală cu semn care reprezintă o putere a lui 10 la care este înmulţită valoarea. Oricare dintre cele trei părţi poate lipsi dar, la scrierea unei astfel de contante trebuie ţinut cont de faptul că obligatoriu trebuie să fie prezentă fie partea fracţionară, fie partea de exponent fie indicatorul lor.

În C exista trei tipuri de date reale (float, double şi long double), în consecinţă există posibilitatea de a folosi trei tipuri de constante reale:

constanta double – se reprezintă pe 64biţi, nu are sufix deci este implicită în C

constanta float – se reprezintă pe 32biţi şi are sufixul f sau F

constanta long double – se reprezintă pe 80 de biţi şi are sufixul l sau L

Reprezentarea datelor flotante conform IEEE 754-2008.

Tipul float Conţine

1. 1 bit de semn (0 reprezintă un număr pozitiv, 1 un număr negativ)

2. 8 biţi exponent (pentru a reprezenta exponenţi negativi există o valoare (eng. bias) – pentru simplă precizie 127 – care trebuie scăzută din exponent pentru a indica valoarea exactă a exponentului.

3. 23 biţi pentru a memora partea zecimală normalizată a valorii de reprezentat (24 biţi

precizie reală) această parte se mai numeşte şi mantisă. Precizia reală este dată de faptul că în mod implicit primul bit al unei reprezentări este totdeauna 1 (şi nu este direct reprezentat) Exemplu: 25 se reprezintă astfel:

Valoarea sa normalizată este 25 (10) =11001 (2) = 1,1001*2 4

Deducem că:

Semnul 0 deoarece numărul este pozitiv

Exponentul este 127(bias) + 4 = 131 reprezentat ca 10000011 în baza 2

Mantisa este 1,1001 din care cifra supraunitară nu se scrie deci 1001 deci în final numărul este:

0 10 0 0 00 1 1 10 0 1 00 0 0 00 0
0
10 0
0
00
1
1
10 0
1
00 0
0
00 0
0
00
0
0
00 0
0 00
0
Adică în hexazecimal 41c8 0000
Exemple:
Valoare
Reprezentare
Constanta
Reprezentare binară
Observaţii
Zecimală
hexazecimală
flotantă
1
1.f
3f80 0000
0
0
1
1
1
1
1
1
0
00
0
0
0
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
Mantisa
are
valoarea 0
-2
-2.f
c000 0000
1
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
≈3.4028234*10 38
3.4028234e38f
7f7f ffff
0
1 1
1
1 1
0 11
1
1
1
1
1
11
1 1
1
1
1
Cea
mai
mare valoare
1/3
0.3333333f
3eaa aaab
0
0
1 1
1
1 0
1 10
0
0
0
0
0
0
01
0
1 0
1
0
1
1
Valoare
rotunjită
0
0.f
0000
0000
0
0
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
Caz special
-0
-0.f
8000
0000
1
0
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
Ciudat
dar
posibil
+∞
7f80 0000
0
1 0
1 0
1 0
1 0
1 0
1 0
00
0
0
0
0
0
0
00
0
0
0
0
0
0
0
Plus infinit
-∞
ff80 0000
1
1 0
1 0
1 0
1 0
1 0
1 0
00
0
0
0
0
0
0
00
0
0
0
0
0
0
0
Minus
infinit

Tipul double are o reprezentare pe 64 biţi. Modul de reprezentare conţine:

1. 1 bit de semn (0 reprezintă un număr pozitiv, 1 un număr negativ)

2. 11 biţi exponent (pentru a reprezenta exponenţi negativi există o valoare – pentru dublă precizie 1023 (2 10 -1) – care trebuie scăzută din exponent pentru a indica valoarea exactă a exponentului.

3. 52 biţi pentru a memora partea zecimală normalizată a valorii de reprezentat (53 biţi precizie reală) adică cca. 15 cifre zecimale.

Tipul long double are o reprezentare pe 80 biţi. Modul de reprezentare conţine:

1. 1 bit de semn (0 reprezintă un număr pozitiv, 1 un număr negativ)

2. 15 biţi exponent (pentru a reprezenta exponenţi negativi există o valoare – pentru

precizie 2 14 -1 – care trebuie scăzută din exponent pentru a indica valoarea exactă a exponentului.

3. 64 biţi pentru a memora partea zecimală normalizată a valorii de reprezentat (65 biţi precizie reală) adică cca. 19 cifre zecimale.

Observaţii:

1. Cele trei reprezentări reale sunt destul de complicate dar de multe ori dorim sa folosim în calcul numere raţionale deci utilizarea lor este pe deplin justificată.

2. Calculatoarele personale moderne folosesc procesoare ce realizează calcule în virgulă

flotantă folosind o reprezentare a datelor pe 80 de biţi (deci precizie de long double).

Constantă caracter

Există multe programe sau subprograme care sunt scrise cu scopul de a prelucra text. Unitatea fundamentală a textului este caracterul. Caracterul este o modalitate simplă şi elegantă de a reprezenta literele, cifrele sau alte simboluri care apar într-un text într-o formă codificată numeric prin aceasta simplificându-se mult prelucrarea şi memorarea acestuia. Cel mai intens folosi mod de a codifica literele şi celelalte simboluri din text este standardizat pentru limba engleză (americană) şi se numeşte ASCII. Din păcate această standardizare nu ţine cont de simbolurile specifice altor ţări (care nu folosesc literele engleze), există preocuparea la nivel internaţional de a realiza standarde internaţionale cere să includă şi caracterele acestor ţări dar din păcate acest lucru este departe de a fi realizat la un nivel

acceptabil de către toată lumea. Setul ASCII cuprinde 128 de caractere realizând o codificare iniţială pe 7 biţi. Pentru că

marea majoritate a calculatoarelor reprezintă datele în multipli de 8 biţi (sau octeţi sau Byte)

putem spune că reprezentarea unui caracter (folosită de fapt şi de C este pe 8 biţi). Observaţii

Pentru informaţii suplimentare studiaţi anexa

Există unele versiuni foarte noi de C (în special folosite în mediul grafic) care recunosc şi folosesc o reprezentare pe 16 biţi a unui caracter dar aceste versiuni nu sunt dezbătute pe cuprinsul acestui curs.

Caracterele ASCII sunt împărţite în:

caractere grafice (adică acele caractere care pot fi reprezentate printr-un simbol grafic) intervalul [33,126]

precum şi caractere negrafice care cuprind valorile {[0,32], 127}

O constantă caracter în C va avea valoarea corespunzătoare codului ASCII al caracterului

ASCII pe care îl reprezintă.

O constantă caracter va fi memorată ca un întreg (va avea tipul int).

O constantă de tip caracter în C poate fi definită ca o construcţie lexicală incluse între două caractere ’(apostrof).

Construcţia lexicală dintre apostroafe poate fi:

un caracter dacă acesta este un simbol grafic cu excepţia caracterului \ (backslash) sau ’ care sunt tratate special de către compilator

un caracter \ urmat de un alt caracter sau literă caz în care caracterul are o semnificaţie specială (vezi tabelul de mai jos).

una sau mai multe (maxim 3) cifre octale (numită secvenţă escape) care sunt interpretate ca o valoare octală pentru a descrie un caracter din tabelul ASCII. O secvenţă escape poate depăşi intervalul normal de definire a unei reprezentări ASCII ([0,127]) ajungând şi în intervalul [128,255] (o extindere pe 8 biţi a codului ASCII) astfel valoare poate fi în octal între 0 şi 377.

Exemple

Constantă

Cod

Cod

Denumire

Utilizare

Caracter

ASCII

ASCII

caracter

zecimal

octal

’\\’

49

57

Backslash

Pentru a putea scrie caracterul backslash

’\’’

39

47

Apostrof

Pentru a putea crea o constantă caracter cu valoarea apostrof

’\”’

34

42

Ghilimele

Pentru a putea crea o constantă caracter cu valoarea ghilimele

’a’

97

141

a

Litera a minusculă

’A’

65

101

A

Litera A majusculă

’0’

48

60

0

Cifra 0 (zero)

’1’

41

61

1

Cifra 1 (unu)

’\a’

7

7

Bell

Calculatorul generează un sunet

’\b’

8

10

Backspace

Un spaţiu înapoi

’\t’

9

11

HT

Tabulator orizontal

’\n’

10

12

LF

Trecere la linie nouă (în C echivalent cu trecere la rând nou)

’\v’

11

13

VT

Tabulator vertical – foarte rar folosit

’\f’

12

14

FF

Salt la pagină nouă (la imprimantă)

’\r’

13

15

CR

Retur de car – revenire la începutul rândului curent

’\7’

7

7

Bell

Ca mai sus la Bell

’ \101’

65

101

A

Litera A majusculă

’ \377’

255

377

???

Cea mai mare valoare ASCII posibil de reprezentat nu se ştie caracterul reprezentat deoarece depinde de la un SO la altul

’ \401’

     

Eroare valoare imposibil de reprezentat (nu există în tabela ASCII

’ \182’

     

Eroare – e nevoie de cifre octale iar 8 nu e una dintre ele

Constantă şir de caractere

O succesiune de zero au mai multe caractere care sunt incluse între ghilimele formează o constantă şir de caractere sau mai pe scurt un şir de caractere.

Fiecare dintre caracterele ce compun şirul poate fi un caracter ca şi cele descrise la constantă caracter. Practic limbajul C va descrie şirul de caractere ca un tablou de caractere care conţine toate caracterele scrise în şir precum şi caracterul ’\0’ (supranumit caracterul null) care in C indică terminarea şirului de caractere. Exemple:

Şir de caractere

 

Reprezentare

 

Byte

 

Observaţii

 

ASCII

 

Hexazecimal

 

Octal

””

NUL

   

00

 

000

1

Şir nul de caractere

 

”a”

a

NUL

   

61

00

 

141

000

2

 

”123”

1