Pointeri și caractere de caractere
O constantă șir scrisă în formular
este o serie de caractere. În reprezentarea internă, această matrice se termină cu caracterul nul '\ 0'. pe care programul poate găsi sfârșitul liniei. Numărul de celule de memorie ocupate este mai mare decât numărul de caractere plasate între ghilimele duble.
Cel mai adesea, constantele de șir sunt utilizate ca argumente funcționale, ca de exemplu în
Când un astfel de șir de caractere apare în program, acesta este accesat printr-un pointer simbolic; și anume printf primește un pointer la începutul matricei de caractere. Mai precis, accesul la constanta string se face printr-un pointer la primul sau element.
Constantele de coarde sunt necesare nu numai ca argumente de funcții. Dacă, de exemplu, variabila pmessage este declarată ca
pmessage = "acum este timpul";
a pus în ea un pointer la șirul de caractere, șirul în sine nu este copiat, copiat doar un pointer la acesta. Operațiile de a lucra cu un șir ca o singură entitate în C nu sunt furnizate.
Există o diferență importantă între următoarele definiții:
char amessage [] = "acum este timpul"; / * array * /
char * pmessage = "acum este timpul"; / * pointer * /
amessage - o matrice având o dimensiune astfel încât doar se potrivește respectiva secvență de caractere și „\ 0“. Caracterele individuale din interiorul matricei se pot schimba, dar amessage întotdeauna indică aceeași locație de memorie. În schimb, pmessage are un pointer inițializat pentru a indica o constantă string. Valoarea pointerului poate fi schimbată, iar ultima va indica ceva altceva. În plus, dacă încercați să schimbați conținutul unei constante, rezultatul va fi nedefinit.
Aspecte suplimentare legate de indicii și matrice, ilustrează mai multe versiuni modificate a două programe utile, pe care le-am luat din biblioteca standard. Prima dintre acestea este funcția strcpy (s, t). copiază șirul t la șirul s. Aș dori să scriu direct s = t. dar acest operator copiază pointerul, nu caracterele. Pentru a copia simbolurile, trebuie să organizăm o buclă. Prima variantă a lui strcpy, folosind o matrice, este după cum urmează:
/ * strcpy: copiază șirul t la s;
varianta cu matrice * /
void strcpy (char s [], char t [])
în timp ce ((s [i] = t [i])! = '\ 0')
Pentru comparație, aici este versiunea lui strcpy cu indicii:
/ * strcpy: copiază șirul t la s;
void strcpy (char * s, char * t)
Din moment ce doar copii ale valorilor argumentului sunt transmise funcției, strcpy poate folosi liber parametrii s și t ca variabile locale. Ele sunt inițializate corespunzător prin pointeri care avansează de fiecare dată la caracterul următor din fiecare matrice până când linia 't' din linia copiată t întâlnește '\ 0'.
În practică, strcpy nu scrie asta. Un programator cu experiență va prefera o intrare mai scurtă:
/ * strcpy: copiază șirul t la s;
Opțiunea 2 cu indicii * /
void strcpy (char * s, char * t)
Creșterea s și t este efectuată aici în partea de control a ciclului. Valoarea * t ++ este caracterul indicat de variabila t înainte ca valoarea sa să crească; Operatorul postfix ++ nu schimbă pointerul t. Simbolul la care se referă el este luat. Același lucru în ceea ce privește s. Mai întâi, simbolul va fi amintit în poziția indicată de vechea valoare a s. și numai după aceea valoarea variabilei s va crește. Simbolul care este transmis este, de asemenea, o valoare care este comparată cu '\ 0'. Ca rezultat, toate caracterele sunt copiate, inclusiv caracterul final '\ 0'.
Observând că comparația cu „\ 0“ nu este necesară (ca în C nenulă valoarea expresiei în starea este tratată și modul în care acesta este adevărul), putem face mai mult una și programul de reducere finală a textului:
/ * strcpy: copiază șirul t la s;
Opțiunea 3 cu indicatori * /
void strcpy (char * s, char * t)
Deși, la prima vedere, ceea ce am obținut pare misterios, totuși acest record este mult mai convenabil și ar trebui să-l stăpâniți, deoarece vă veți întâlni adesea în programele C.
În ceea ce privește funcția strcpy din biblioteca standard
Al doilea program, pe care îl vom considera aici, este strcmp (s, t). Acesta compară siruri de cod s și t și returnează o valoare negativă, zero sau pozitiv, respectiv, în cazul în care un rând e lexicografic mai mic, egal sau mai mare decât șirul t. Rezultatul este obținut prin scăderea primelor simboluri nerecomandate de la s și t.
/ * strcmp: rezultat <0 при s > 0 pentru s> t * / int strcmp (char s [], char t []) pentru (i = 0; s [i] == t [i]; i ++)Articole similare