Bună ziua și binevenită înapoi și această prelegere vreau să vorbesc despre folosirea pointerilor și structurilor
cum sunt legate, putem avea elemente din interiorul unei structuri să fie un pointer și apoi putem face structurile
noastre ele însele sau să fie pointeri la concepte foarte utile.
Deci structurile din pointerii C permit indicii pentru structuri.
Așa că atunci când creăm o variabilă a structurii de tip pe care o putem crea ca indicatori de pointer,
structurile sunt mai ușor de manipulat decât structurile în sine.
Din nou, este un fel de lucru notational care face lucrurile mult mai usor si este, de asemenea,
mai eficient in unele implementari mai vechi ale limbajului C.
O structură nu poate fi trecută ca argument pentru o funcție, dar știm că un pointer poate.
Deci, acesta este un alt motiv pentru care doriți să aveți o structură care să fie un indicator.
Atunci când o declarați, deoarece puteți să o transmiteți în versiunile mai vechi ale lui C, puteți să o transmiteți ca argument
la o funcție, chiar
dacă puteți trece o structură ca argument care să treacă printr-un pointer este mai eficient.
Știm că e mai eficient.
Am vorbit despre asta în trecut.
Trecerea unui indicator poate fi mai eficientă.
În acest caz este chiar mai eficient, deoarece dacă treceți într-o structură întreagă dacă structura
este mare și conține multe elemente, copiați toate elementele din structură
la acel parametru.
Dacă transmiteți un pointer doar copiați adresa.
OK, deci este și mai important cu indicii ca argumente care sunt structurate
deoarece structurile pot fi atât de multe structuri de reprezentări de date care conțin indicii către alte structuri.
Veți vedea acest lucru foarte mult în toate structurile programelor dvs. C care sunt indicii din motivele pe care le-am
menționat.
Știți că puteți să le transmiteți ca parametri pe versiunile mai vechi ale lui C și este
și mai eficient deoarece faceți totul prin trecere prin valoare care copiază mult mai eficient
copierea și adresa decât copierea tuturor elementelor unei structuri mari.
Deci declararea unei structuri este un pointer destul de simplă atunci când definiți o variabilă a fi un pointer la
un struct.
Folosiți doar asteriscul după tipul de date.
Corect și am spus că structurile sunt într-adevăr un tip nou.
În acest caz, avem ziua noastră pe o structură de date foarte importantă.
Doar spunem zi de structură și apoi folosim indicatorul adânc al asteriscului.
Apoi, probabil că doriți să inițializați acest lucru fără să vă amintiți atunci când
spuneți struct Pointer struct pointer care nu alocă nici o memorie pentru a acumula memorie pentru a stoca pointerul corect drept.
Nu creează memorie pentru datele din interiorul acestuia.
Așadar, ați putea fi repartizat la acest opt ​​punct sau la adresa unei alte date
de structură sau ați putea aloca memorie în altă parte.
Sau l-ați putea inițializa și cu unele date în acest fel.
Deci, variabila d pointer poate fi atribuit la fel ca alte pointeri.
Poți să o stabilești pentru a indica data de astăzi cu declarația de atribuire, așa că am făcut deja o declarație Voeckler
a zilei de astăzi.
Am folosi doar ampersand pentru a obține adresa.
Așa că am creat o structură de zi normală și este data de astăzi.
Așa că ar crea memorie pentru cele trei elemente și apoi vom crea POINAR-ul nostru și
îl vom atribui.
Adresa celeilalte date.
Destul de drept.
Am făcut asta cu tipuri de date obișnuite.
Nu e diferit când o faci cu structuri.
Apoi puteți accesa în mod indirect oricare dintre membrii structurii de date la care se referă dreptul de pointer.
Așadar, ar fi trebuit să facem ceva de genul asta corect dacă vroiai să accesezi elementul indicatorului
de zi al zilei pe care ar trebui să-l dereferezi mai întâi corect și deci ar fi util să-l pui în
paranteze Deci, este foarte simplu.
Trebuie să dereferenți indicatorul de dată pentru a obține valoarea a ceea ce este data de
astăzi indicând valoarea adresei datei de astăzi care indică o comandă pentru a seta anumite valori, astfel încât să o
dereferențiați și apoi să faceți punct de equals 21 și care ar atribui 21 la pointerul tău de dată.
Acum, cele de mai sus spun doar ceea ce arată astăzi.
Vrem să accesăm acea valoare și să setăm ziua la 21.
În acest caz, parantezele sunt obligatorii deoarece asteriscul are un precedent mai înalt sau DOT are o prioritate
mai mare în asterisc.
Dacă nu ați pus parantezele acolo și s-ar fi înșelat pentru că ar încerca să facă
primul punct înainte să de fapt să aducă pointerul la pointer.
Pointerul la date, astfel încât ar încerca să acceseze datele cu un pointer nul în esență.
Deci prin dereferențiere obțineți valoarea.
Acum, atunci când folosim proxy-urile este pointeri.
Dacă vrem să testăm valoarea lunilor stocate în structura de date indicată prin pointerul de dată, putem face ceva
de genul acesta.
Dreapta.
Am dereferența indicatorul sau a pus în paranteze astfel încât acesta să aibă prioritate față de punct și apoi spunem
că banii sunt egali cu 12.
Sintaxa perfect valabilă, dar este cam cam greoaie, așa că C are propria sintaxă, astfel încât să nu trebuie să dereferenți
totul și să o puneți în interiorul parantezelor pentru structuri când doriți să accesați
ceea ce indică structura.
Nu trebuie să o dereferenți în acest fel.
Există un operator special care există în C pentru structurile de indicatori și este mai mult decât o linie
întreruptă, urmată de semnul mai mare decât semnul.
Și acest lucru vă permite să nu trebuie să dereference pointer.
Deci, în loc de a face stea x în interiorul parantezelor și apoi punct y puteți spune doar X Dasch mai mare decât Y deoarece X
este un pointer.
Nu aveți referința și doriți să accesați elementul din interiorul structurii pe care
îl îndreptați.
Deci, veți vedea această sintaxă peste tot.
Nu veți vedea parantezele din dereferență.
Este perfect valabil, dar introduceți mai multe caractere.
Este mult mai eficient să spui doar că X-ul este mai mare decât Y, deci afirmația anterioară aici, în loc de referire în
interiorul parantezelor, tot ce trebuie să faceți este să vedeți dacă biroul pointerului sau al
acelei luni.
Și este oarecum intuitivă, pentru că biroul mai mare atunci este un fel de a spune că este
indicat la ceva și așa că bate mai mult de lună.
Și astfel pointerul este un indicator și de aceea folosiți linia mai mare atunci.
Dacă ar fi o structură imbrăcată, ați face datele mai mari decât structura și apoi ar trebui să
faceți un punct după aceea pentru a accesa elementele structurii imbricate.
Dar pentru că pointerul este un pointer, trebuie să utilizați biroul de dashi egal cu.
Deci, iată un exemplu.
Creăm ziua noastră de structură.
Avem trei elemente.
Atunci ne creăm indicatorul nostru de indicatori și creăm doar o variabilă obișnuită.
Astăzi atribuim indicatorul nostru azi și apoi atribuim elemente reale ale structului.
Folosim doar masqueraderul.
Și apoi îl putem tipări.
Așadar, să analizăm acest lucru în blocurile de coduri pentru a vedea cum funcționează acest lucru.
Deci, pentru a pune acest exemplu aici și, de obicei, când definiți structurile pe care le definiți în afara
unei funcții, atunci puteți să le folosiți în orice funcție.
Este un fel de global.
Dar rețineți că atunci când definiți structura, nu creați nici o memorie.
Deci, încă mai trebuie să creați variabilele ca variabile locale sau indicatori.
Dar definiția reală este în afara funcției.
Deci, dacă doriți să o utilizați, puteți să o utilizați în orice funcție.
Deci, aici, în partea superioară, am creat o nouă dată tip de structură fiind numită dată și conține trei numere întregi.
Încheiem cu suma pe care o chem.
Apoi creem o pereche de variabile în interiorul celei principale, care este astăzi doar o variabilă normală
struct struct.
Și apoi unul care este un pointer.
Știm că este un pointer deoarece are asteriscul înaintea lui.
Știm că un pointer când creezi un pointer pe care îl creează doar alocă memorie pentru a stoca
acea adresă pentru acea valoare pentru acel indicator, așa că ar trebui să îi atribuim o adresă pe care o facem
cu ampersand astăzi pentru că am creat și asta e de fapt o memorie.
Deci, indicatorul va îndrepta spre ceea ce este astăzi cu adresa de astăzi.
Putem apoi să începem să-i atribuim date utilizând acest birou pentru a fi apoi foarte util și să alocăm doar date
ca oricare altul pentru a utiliza operatorul de atribuire.
Iar atunci când îl imprimam, observăm că nu trebuie să dereferențăm să-l tipărim pentru ao
imprima.
Putem spune, de fapt, că tipurile de date pentru formatele de specificare a formatului sunt la fel procentaje pentru
toți juriștii.
Și apoi vom folosi doar masquerader pentru că asta face de fapt, dereferencing amintesc.
Acum am putea schimba acest lucru și acest lucru va fi valabil.
Trebuie să punem paranteze și apoi trebuie să spunem luna punctată.
În orice caz este bine, dar obișnuiți-vă cu linia și mai mare, deoarece este o sintaxă mai bună și acum
construim acest lucru.
Veți vedea că imprimă valorile zilnice ale indicatorilor și sunt setați la 925 în 2015.
Deci, deoarece data de astăzi este Neyens ultima 25:15 a fost formatat imprimarea în acest fel.
Lucru destul de simplu.
Doar amintiți-vă că moartea este mai mare decât asta va fi nouă.
Aceasta este o nouă sintaxă pentru distrugerea indicatorilor, dar orice altceva aici este doar normal.
Știm că indicatorii trebuie să aibă adrese de magazin, așa că știm că trebuie să alocăm
fie Mallik o memorie dinamică, fie trebuie să atribuim un struct existent.
Să ne întoarcem și să vorbim mai mult despre lovituri și indicii.
Acum hai să vorbim despre structuri care conțin indicii.
Știm cum să creăm un pointer pentru o structură.
Am putea să alocăm memorie pentru acel indicator dacă nu vrem să conectăm o
adresă existentă a pointerului existent.
Dar, de asemenea, puteți avea elemente în interiorul unei structuri care este un pointer în sine, astfel încât un pointer poate fi
de asemenea membru al unei structuri.
Nu trebuie să folosim matricea de caractere.
Așadar, am putea spune structura pe care am putea să o numim în pointeri și apoi am putea folosi aici
în acest exemplu avem două numere întregi pentru a introduce indicii dvs. P doriți o sintaxă perfect valabilă pentru a face acest lucru.
Deci, o structură numită pointeri este definită să conțină două pointeri întregi.
Primul se numește P1, iar cel de-al doilea se numește P2.
Puteți defini o variabilă de tipul struct any pointers la fel ca pointeri normale struct pointers pointer variabil poate fi folosit acum
la fel ca alte struts pointer lui nu este un struct sau îmi pare rău indicatorul nu
este un pointer este indicii.
Acesta conține două elemente din interiorul Irakului care sunt indicii, dar indicii în sine nu reprezintă un indicator real.
Bine, da atenție la asta.
Este o variabilă de structură care are doi indicatori ca membri ai acesteia.
Asta e diferit.
Deci, dacă vrem să accesăm elementele din interiorul variabilei pointerilor, care este un în pointeri nu folosim sarcina mai mare
decât dreapta deoarece pointerii nu este un pointer este un struct.
Am folosi punctul pentru a accesa și un punct de acces.
Astfel, în acest exemplu creăm structura noastră, creăm o variabilă.
Nu este un pointer numit pointeri.
Și apoi vom crea două numere întregi pe care le-am câștigat egal cu 100 în două, care nu sunt inițializate.
Acum, unul din două sunt indicii corecte.
Deci, trebuie să conțină adrese de memorie valide în care au fost alocate memorie.
Și asta vreau să le conectez.
Faceam.
Când declarați variabilele întregi, memoria este alocată acelor numere întregi.
Și prin atribuirea adresei vreau un aitu la P1 P2 care este perfect.
Pentru că vreau să aibă memorie alocată pentru că există periculoasă.
Acum, dacă indicatorii întregi nu au fost în ea punctul dvs. este ceea ce au
fost pointeri caracter, atunci ar trebui să aloce memorie dinamică.
Deci, acum doar folosim numere întregi, astfel încât să atribuim adresele celor două numere întregi către p dorit doi.
Putem spune acum că indicatorii de steluță sunt P2 egali 97 negativi 97.
De ce trebuie să o dereferențăm acolo.
Deoarece pointerii nu P2 este ceea ce facem referire.
Indică faptul că Peetie P2 este numită.
Nu accesăm un element al unui struct, unde s-au dereferențial toate indicatorii care nu sunt P.
Și o să atribuim acea valoare indiferent de ce ne indică negativ 97.
Observați diferența de acolo.
Nu creăm o structură POINAR creăm un pointer variabil mai regulat, dar conține două elemente
care sunt pointeri.
Deci, dacă vrem să le atribuim celor două elemente din interiorul structurii, trebuie să le dereferențăm
folosind operatorul de indirecție.
Și asta facem noi.
Și apoi, în cele două declarații de tipărire din nou, dorim din nou să tipărim valorile a ceea ce
P indică.
Așa că o dereferențăm.
La fel cu P2.
Și apoi vrem să tipăm din nou valorile la care indică indicii.
Deci, în primul rând, spunem că am câștigat egal cu procentele, iar indicii de virgulă P1 sunt egale cu procentele.
I.
Primul din interiorul citatelor duble este doar tipărirea textului real care
nu se referă la nimic după ce virgulele au făcut dereferențierea au fost prima imprimare I 1 care este de
100 și apoi tipărirea până la punctul 1 care ar fi 100 și apoi Aitu care se va fie că
I2 este de fapt negativă 97 după ce l-am atribuit lui p.
Deci, ce despre matrice de caractere sau pointeri de caractere vorbim noi.
Am privit în cursul precedent despre care am vorbit despre modul în care puteți crea o matrice de caractere
este un element în interiorul unui indicator, dar despre indicii de caractere pe care îl cunoașteți dacă ar trebui să facem ceva ca primul și ultimul să aibă caractere de caractere
sau ar trebui să facem doar ceva de genul întâi și ultima cu indicii de
caracter ca elemente.
Care este cea mai bună opțiune.
Ei bine, vom vedea că este într-adevăr un lucru notar, dar există avantaje pentru a utiliza indicii.
Deci, atunci când creăm pointeri la caractere în interiorul altor elemente, este de obicei puțin mai bine,
dar trebuie să înțelegeți ce se întâmplă aici când creați un element un element de tablou matricial ca un element
sau un pointer este un element.
Ambele sunt valide.
Dar există o mare diferență.
Deci, dacă spunem nume de structură V sau V-P și spunem Tallia și veri și apoi spunem pointer struct.
Așadar amintiți-vă că numele structurilor conțin caracterele structurilor pointerului conțin indicii și noi suntem inițializați
și indicatorii egali cu Bradd și jauh care se încadrează.
Și apoi le imprimam.
Vom imprima primele elemente care sunt un caracter NVP și apoi primul element al lui Treze care
este un pointer la început.
Deci variabila nume de structuri v.
Ce se întâmplă aici este că șirurile sunt stocate în interiorul structurii.
Structura este alocată.
Total 40 de octeți pentru a ține cele două nume cursa caracterului lor.
Asta se întâmplă când creați caractere în interiorul unui indicator.
Suntem 40 de octeți pentru a ține aceste două nume.
O.K.
20 în 20 pentru variabila nume de colț Treze.
Ce avem doi indicatori.
Primul și ultimul Acestea sunt șiruri care sunt stocate oriunde compilatorul stochează constante șir.
Structura deține cele două adrese, deoarece acestea sunt indicii pointerilor care conțin valorile care
sunt adrese.
Deci, tot ce trebuie să faceți este să alocați două indicatoare în interiorul acelei structuri, care este de 16 octeți pentru majoritatea sistemelor.
Indicatorii sunt de obicei un octet la 4 octeți.
Structura de structurare nu alocă nici un spațiu pentru a stoca șiruri de caractere, deoarece este doar alocarea
spațiului pentru indicii ei înșiși.
Indicatorii au valori care sunt adrese.
Scrieți adresa pe care o indică că nu există o memorie alocată pentru asta.
Deci, când creați acești doi indicatori, nu există memorie alocată pentru acești doi indicatori.
El nu păstrează nici un spațiu, astfel încât acesta să poată fi utilizat numai cu șiruri de caractere care le-au alocat spațiu în altă parte.
Ori de câte ori aveți indicii din interiorul unei structuri, trebuie să o utilizați pe Mallick.
În caz contrar, ele pot fi stocate ori de câte ori sunt stocate constante șir.
Și aceasta este diferența mare, astfel încât pointerii și Pini de structură ar
trebui să fie folosiți doar pentru a gestiona șiruri care au fost create și alocate în altă parte în program pe care nu doriți să le atribuiți date
decât dacă le-ați alocat dinamic sau care a fost alocat în altă parte .
Poate de către un struct existent sau ceva, dar de obicei veți dori să Mallik aceste pointeri.
Din nou, foarte diferit.
Alocați 40 de octeți pentru aceste două caractere în structura de nume pentru structura peening.
Aveți două indicii.
Nu există o memorie alocată pentru asta atunci când creați o variabilă de tipul respectiv.
Este doar crearea de memorie pentru indicatorii doi caractere, care este de 8 octeți fiecare pentru a aloca de fapt, memorie
pentru ceea ce primul și ultimul indică.
Trebuie să faci un malloc.
Deci, o instanță în care are sens să folosești un pointer într-o structură este să te ocupi de
șiruri de caractere dacă ai memorie alocată dinamic.
De obicei, atunci când o utilizați, deoarece alte tipuri de date primitive vor aloca automat memoria
pentru dvs.
Deci, doriți să utilizați un pointer pentru a stoca adresa.
Acest lucru are avantajul că puteți să cereți malloc să aloce doar spațiul necesar pentru un
șir.
Am vorbit despre avantajele alocării dinamice a memoriei.
Atunci când creați lucrurile în mod static la momentul compilării, veți crea doar un anumit număr de octeți.
Ce se întâmplă dacă aveți nevoie de mai mulți octeți dacă sunteți înșurubați.
Programul tău nu va funcționa.
Trebuie să vă întoarceți și să recompilați cu șiruri dinamice alocate.
Vă puteți reajusta.
Puteți face.
Puteți crea la fel de multă memorie de care aveți nevoie.
Ceea ce o face mult mai eficientă în program.
Deci, veți folosi Malecon orice pointeri creați în interiorul unui struct.
Deci, în acest caz, aveți struct denumit numit count.
Aveți două pointeri indicatori de caracter.
Numele și ultimul nume și apoi aveți o schemă int, cele două șiruri din interiorul fie nu sunt
stocate în structură.
Creăm doar memorie pentru indicatorii care conțin adrese.
Vrem să creăm memorie pentru numele aplicației și numele pentru ce indicatori indică.
Așadar, vrem să stocăm într-o bucată gestionată de atunci alocarea de memorie Nemec, care folosește Mallick, adresa
celor două șiruri nu este stocată spre ceea ce indică.
Deci, adresele sunt funcțiile de manipulare a șirurilor cu care lucrați.
Ceea ce este bun și de aceea doriți să folosiți indicii acolo pentru că atunci nu trebuie să faceți asta.
Apoi, puteți să le împărțiți mult mai ușor.
Deci, iată un exemplu.
Avem o funcție numită Get Info.
Este nevoie de un pointer OK și putem trece pointerul în jur foarte ușor.
Acum, de asemenea, vom crea o matrice de notter sau patru pointeri care i-au fost transmise.
Vom aloca memorie pentru asta.
Deci veți vedea că vom crea un caracter numit temp și apoi vom stoca unele date în acea matrice temp.
Cerem utilizatorului să obțină ceva ce nu ne-am familiarizat cu Escott, dar este același lucru cu
cel al pieței salvate.
Ei bine, atunci alocăm memoria pentru numele Affe în interiorul acelui indicator și facem asta exact așa cum ne alocăm memoria pentru orice caracter pe
care noi l-am numit Mallick pe care l-am trecut și numărul octeților în acest caz lungimea Sturr de
zece plus unu pentru terminatorul null.
Și apoi țineți minte că malloc se transformă într-o vedetă, așa că o aruncăm într-o stea de caractere.
Dar acest lucru este critic aici.
Acest apel malloc este necesar pentru orice structură care conține indicii.
Acum trecem prin acest punct sau prin pointer.
Niciodată nu a fost alocată o memorie.
Deci, am alocat memorie aici.
Putem apoi face copia noastră foarte ușor putem copia temp la un nume al structurii noastre.
T care a fost transmisă ca parametru și apoi le putem introduce numele de familie.
Putem memora Mallik mai multă memorie pentru ultimul nume și apoi stocată în ultima variabilă denumită struct.
Aceasta este ceea ce va trebui să faceți atunci când, atunci când aveți indicii
pentru caractere în interiorul structurilor dvs., trebuie să faceți Mallik deoarece din nou acele indicii stochează numai adresa.
Ei alocă suficientă memorie pentru a stoca o adresă care nu are suficientă memorie pentru a stoca un șir, indiferent de adresa la
care se îndreaptă.
Trebuie să alocați memorie pentru asta și o faci la fel ca în cazul
normal, cu diferențele Mallik doar aici folosiți decoratorul și apoi semnați pentru a accesa elementul real din cadrul structului care
este un pointer de caractere, astfel încât să îl puteți atribui și care face dereferencing .
Așa că vrei să te joci cu chestiile astea.
Acest lucru este foarte comun pentru indicatorii de caractere din cadrul Atrox.
Vom avea o provocare acolo unde va trebui să faceți asta, dar jucați cu acest cod
intrați în blocurile de coduri.
Începeți să alocați memorie pentru șiruri de caractere sau indicatori de caractere în interiorul stocurilor și vedeți cum puteți
folosi apoi copia lor pentru a pune datele în interior.
Dar mai întâi trebuie să alocați memoria înainte de alocare.
Dacă faci constante ca în exemplul anterior cine știe unde este alocată memoria.
Deci, din nou, o mulțime de concepte importante prezentate în această prelegere.
Această idee a unei structuri care este un pointer și această nouă sintaxă în care poți folosi linia mai mare decât.
Spre deosebire de utilizarea operatorului de indirecție.
Foarte frumos.
Și apoi, de fapt, având elemente ca indicii în modul în care trebuie să alocați memorie pentru indicii de caractere.
Mulțumesc.