>> [MUSIC JOC]
>> DOUG LLOYD: indicii, iată-ne.
Acest lucru este, probabil, va fi cel mai dificil subiect
că vorbim despre în CS50.
Și dacă ați citit nimic despre indicii
înainte de a putea fi un pic intimidare a intra în acest videoclip.
E adevărat indicii nu permiteți capacitatea
să șurub sus, probabil, destul de rău atunci când sunteți
de lucru cu variabile, și date, și cauzând programul sa se prabuseasca.
Dar sunt de fapt foarte util și ne-au un mod foarte mare permite
pentru a trece de date înapoi și înapoi între funcții,
că suntem altfel în imposibilitatea de a face.
>> Și așa mai departe ceea ce suntem cu adevarat vrei sa faci aici este trenul
tine de a avea disciplina bun indicator, așa pe care le puteți utiliza în mod eficient indicii
pentru a face programele că mult mai bine.
Așa cum am spus indicii ne dau un alt modalitate de a trece de date între funcții.
Acum, dacă vă amintiți de la un film mai devreme, atunci când
am vorbit despre domeniul de aplicare variabil, am menționat
că toate datele pe care le trece între funcții în C este trecut prin valoare.
Și eu nu pot fi utilizate ca pe termen lung, ceea ce am vrut să spun că
a fost că trecem de copii ale datelor.
Când trecem o variabilă la o funcție, nu suntem de fapt trece variabila
la funcția, nu?
Suntem trece o copie a că datele pentru funcția.
Funcția face ceea ce va și calculează o valoare,
și poate vom folosi această valoare atunci când dă înapoi.
>> Nu a fost o excepție de la această regulă de trece prin valoare,
și vom reveni la ceea ce că este un pic mai târziu în acest film.
Dacă vom folosi în schimb indicii de a folosi variabile,
sau în locul folosirii variabilelor ei sau copii ale variabilelor,
putem trece acum variabilele din jurul între funcțiile într-un mod diferit.
Acest lucru înseamnă că, dacă facem o schimbare într-o singură funcție,
că schimbarea va avea de fapt efect într-o funcție diferită.
Din nou, acest lucru este ceva care nu am putea face anterior,
și dacă ați încercat vreodată să swap Valoarea de două variabile într-o funcție,
ai observat această problemă un fel de târâtor în sus, nu?
>> Dacă vrem să facă schimb de X și Y, iar noi le trece la o funcție numită de swap,
în interiorul a funcției swap variabile face valori de schimb.
Unul devine doi, doua devine o, dar nu face de fapt
schimba nimic în original funcție, în apelantul.
Pentru că nu putem, suntem doar de lucru cu copii ale acestora.
Cu indicii, deși, putem treci de fapt X și Y la o funcție.
Această funcție se poate face ceva cu ei.
Și aceste valori variabile se poate schimba de fapt.
Așa că e destul de o schimbare în capacitatea noastra de a lucra cu date.
>> Înainte de a se arunca cu capul în indicii, cred că merită
luând câteva minute până la du-te înapoi la elementele de bază aici.
Și au o privire la modul Lucrari de memorie de calculator
pentru că aceste două subiecte sunt de gând pentru a fi de fapt destul de interdependente.
După cum probabil știți, pe sistemul de computer
aveți un hard disk sau poate o unitate SSD,
un fel de loc de depozitare de fișiere.
Este, de obicei, undeva în cartier de 250 de gigabytes
să poate un cuplu de terabytes acum.
Și e în cazul în care toate dvs. fișiere în cele din urmă trăi,
chiar și atunci când computerul este oprit off, îl puteți întoarce la
și veți găsi fișierele sunt acolo din nou, atunci când reporniți sistemul.
Dar unitățile de disc, cum ar fi o unitate hard disk, un HDD, sau o unitate SSD, un SSD,
sunt spațiu de stocare doar.
>> Nu putem face nimic cu de fapt, datele care se află în hard disk,
sau într-o unitate SSD.
În scopul de a schimba efectiv de date sau mutați-l în jurul valorii de,
am să-l mute la RAM, memorie cu acces aleator.
Acum RAM, aveți o mulțime mai puțin de pe computer.
Este posibil să aveți undeva în cartier de 512 megaocteți
dacă aveți un calculator mai vechi, la poate două, patru, opt, 16,
eventual, chiar un pic mai mult, gigabytes de memorie RAM.
Deci asta e mult mai mici, dar asta e unde toate datele volatile există.
Asta e unde putem schimba lucrurile.
Dar când ne întoarcem calculatorul nostru off, toate datele din memoria RAM este distrus.
>> Deci, de aceea avem nevoie de hard disk pentru localizarea permanentă a acestuia,
astfel încât să exists- aceasta ar fi foarte rău dacă de fiecare dată când
transformat calculatorul nostru oprit, fiecare fișier în sistemul nostru a fost șters.
Așa că am de lucru în interiorul RAM.
Și de fiecare dată când vorbim despre memorie, destul de mult, în CS50,
vorbim despre RAM, nu pe hard disk.
>> Așa că atunci când ne-am muta lucrurile în memorie, este nevoie de o anumită cantitate de spațiu.
Toate tipurile de date care am fost de lucru cu
ia diferite cantități de spațiu în memoria RAM.
Deci, de fiecare dată când creați un număr întreg variabile, patru bytes de memorie
sunt retrase din circuitul agricol în memoria RAM, astfel încât să poate lucra cu asta întreg.
Puteți declara întreg, schimba-l, ea atribuie
la o valoare de 10 incrementat câte unul, așa mai departe și așa mai departe.
Tot ce trebuie să se întâmple în RAM, și veți obține patru octeți
pentru a lucra cu pentru fiecare întreg pe care le creați.
>> Fiecare personaj vă crea devine un octet.
Asta e doar cât de mult spațiu este necesare pentru a stoca un caracter.
Fiecare float, un adevărat numărul, devine patru bytes
excepția cazului în care este un dublu precizie în virgulă mobilă
număr, care vă permite să au cifre mai precise sau mai multe
după virgulă fără a pierde de precizie,
care ia opt bytes de memorie.
Tânjește lungi, numere întregi foarte mari, De asemenea, ia opt bytes de memorie.
Câte bytes de memorie nu siruri de caractere ia?
Ei bine, să punem un ac în această întrebare pentru acum, dar vom reveni la ea.
>> Deci, înapoi la această idee de memorie ca o gamă mare de celule-octet dimensiuni.
Asta e într-adevăr tot ce este, e doar o gamă foarte mare de celule,
la fel ca orice alt matrice care esti familiarizat cu și să vedem,
cu excepția fiecare element este un octet larg.
Și la fel ca o matrice, fiecare element are o adresă.
Fiecare element al unui tablou are un index, iar noi
poate folosi ca index pentru a face așa-numitele acces aleatoriu pe matrice.
Noi nu trebuie să înceapă de la începutul matrice,
repeta prin fiecare singur element al acestuia,
pentru a găsi ceea ce căutați.
Putem spune doar, vreau să ajung la Elementul 15 sau elementul 100.
Și tu poți trece doar în acest număr și pentru a obține valoarea pe care îl căutați.
>> În mod similar fiecare locație în memorie are o adresă.
Deci, memoria ar putea arata ceva de genul asta.
Iată o foarte mică bucată de memorie, aceasta este de 20 de bytes de memorie.
Primii 20 de octeți din cauza mea adresează acolo în partea inferioară
sunt 0, 1, 2, 3, și așa pe tot drumul până la 19.
Și când am declara variabile și când am început să lucrez cu ei,
sistemul va seta deoparte un spațiu pentru mine
în această memorie pentru a lucra cu variabile mele.
Așa că s-ar putea spune, char c este egal cu capitalul H. Și ce se va întâmpla?
Ei bine, sistemul este de gând să retrase din circuitul agricol pentru mine un octet.
În acest caz, a ales numărul octet patru, octet la adresa de patru,
si va pentru a stoca H majusculă acolo pentru mine.
Dacă spun atunci viteza int limită este egal cu 65 de ani, e
O să anuleze patru bytes de memorie pentru mine.
Și o să trateze pe cei patru octeți ca o singură unitate
pentru că ceea ce lucrăm cu este un număr întreg de aici.
Si va stoca 65 acolo.
>> Acum deja sunt un fel de vă spun un pic de o minciună,
Bine, pentru că știm că computere lucrează în binar.
Ei nu înțeleg în mod necesar ceea ce un capital H este
sau ceea ce o 65 de ani este, numai ei înțelege binare, zerouri și cele.
Și așa mai departe, de fapt ceea ce suntem stocarea acolo
nu este litera H și numărul de 65 de ani, ci reprezentările binare
acestuia, care arata o ceva de genul asta.
Și în special în context al variabilei întreg,
nu va doar o scuipe în, nu va să-l trateze ca o patru
bucată octet necesar, se intampla de fapt
să-l trateze ca patru una bucăți octet, care ar putea arata ceva de genul asta.
Și chiar acest lucru nu este în întregime adevărat, fie,
din cauza ceva numit un endianness, care nu suntem
mergi la a lua în acum, dar Daca esti curios despre,
puteți citi pe puțin și endianness mare.
Dar de dragul acestui argument, de dragul acestui videoclip,
hai să presupunem că este, în De fapt, modul în care numărul 65 ar fi
fie reprezentate în de memorie pe fiecare sistem,
deși nu este în întregime adevărat.
>> Dar să fapt chiar a lua scăpa de toate binare în întregime,
și cred că doar despre cum H și 65 de ani, este mult mai ușor
să se gândească la ea ca care ca o ființă umană.
Bine, asa ca, de asemenea, pare poate o puțin aleatoriu care I've- sistemul meu
nu mi-a dat bytes 5, 6, 7, și 8 pentru a stoca un număr întreg.
E un motiv pentru care, de asemenea, care nu vom intra în chiar acum, dar suficient
să spunem că ceea ce calculator este de a face aici
este, probabil, o miscare buna din partea sa.
Pentru a nu-mi dai de memorie care este înapoi neapărat să înapoi.
Deși este de gând să o fac acum dacă vreau să obțineți un alt șir,
numit prenumele, și vreau pentru a pune Lloyd acolo.
Am de gând să nevoie pentru a se potrivi o caracter, fiecare literă din care este
O să solicite o caracter, un octet de memorie.
Deci, dacă am putea pune Lloyd în matrice mea așa sunt destul de bun pentru a merge, nu?
Ce lipsește?
>> Amintiți-vă că fiecare șir lucrăm cu în C se încheie cu backslash la zero,
și nu putem omite faptul că aici, fie.
Avem nevoie să pună deoparte un octet de memorie să se constate că, astfel ne-am
știu când șir noastră sa încheiat.
Deci, din nou acest aranjament de modul în care lucrurile
apar în puterea de memorie fi un pic aleatoriu,
dar este de fapt modul în care majoritatea sistemelor sunt concepute.
Pentru a le alinia pe multipli de patru, din motive nou
că nu trebuie să intra in chiar acum.
Dar acest lucru, astfel încât este suficient să spunem că După aceste trei linii de cod,
acest lucru este ceea ce s-ar putea arata memorie ca.
Dacă am nevoie de locații de memorie 4, 8, 12 și să dețină datele mele,
acest lucru este ceea ce s-ar putea arata ca memoria mea.
>> Și fi deosebit de pedant aici, atunci când
vorbim despre memorie Noi, de obicei adrese
face acest lucru folosind notații hexazecimale.
Deci, de ce nu ne-am converti toate acestea de la zecimal la notație hexazecimală
doar pentru că asta e, în general, cum ne referim la memorie.
Deci, în loc de a fi 0 prin 19, ceea ce avem este zero
X zero, prin zero x1 trei.
Acestea sunt cele 20 de bytes de memorie pe care le au sau ne uitam la această imagine în
chiar aici.
>> Deci, toate acestea fiind spuse, hai să pas departe de memorie pentru un al doilea
și înapoi la indicii.
Aici este cel mai important lucru de retinut
așa cum am începe să lucreze cu indicatori.
Un pointer este nimic mai mult decât o adresă.
Voi spune din nou că este atât de important,
un pointer este nimic mai mult decât o adresă.
Indicii sunt adrese către locații în memorie în cazul în care locuiesc variabile.
Știind că acesta devine un sperăm pic mai ușor să lucreze cu ei.
Un alt lucru îmi place de a face este de a avea un fel
diagramelor vizual reprezintă ceea ce este întâmplă cu diverse linii de cod.
Și vom face acest lucru un cuplu de ori în indicii,
și atunci când vorbim despre dinamica alocare de memorie, de asemenea.
Pentru că eu cred că aceste diagrame poate fi deosebit de utile.
>> Deci, dacă spun, de exemplu, Int K în codul meu, ceea ce se întâmplă?
Ei bine, ceea ce se întâmplă de fapt este Primesc memorie rezervată pentru mine,
dar nu-mi place chiar cred despre ea ca asta,
place să se gândească la el ca o cutie.
Am o cutie și este de culoare verde, pentru că
pot pune numere întregi în cutii verzi.
Dacă ar fi fost un personaj I ar putea avea o cutie albastră.
Dar eu spun întotdeauna, dacă am crea o cutie care poate stoca numere întregi
cutia este de culoare verde.
Și eu iau un marker permanent și scriu k de partea aceasta.
Deci, am o cutie numită K, în care pot pune numere întregi.
Așa că atunci când spun int k, asta e ceea ce se întâmplă în capul meu.
Dacă spun k este egal cu cinci, ce fac?
Ei bine, eu pun cinci centru, dreapta.
Acest lucru este destul de simplă, în cazul în care Eu spun Int k, a crea o cutie numita k.
Dacă spun k este egal cu 5, pus cinci în caseta.
Să sperăm că asta nu e prea mult de un salt.
Iată unde lucrurile nu merg un puțin interesant, deși.
Dacă spun int * PK, bine, chiar dacă nu Știi ce înseamnă asta în mod necesar,
se are în mod clar ceva de a face cu un număr întreg.
Deci, am de gând să coloreze această casetă verde-ish,
Știu că are ceva de a face cu un număr întreg,
dar nu este un număr întreg de sine, pentru că este o stea Int.
Nu e ceva ușor diferite cu privire la aceasta.
Atât de implicat un număr întreg, a dar altfel e
nu prea diferită de ce vorbeam.
E o cutie, sa luat o etichetă, se poartă un PK etichetă,
și este capabil să mențină stele int, oricare ar fi acestea sunt.
Ei au ceva de a face cu numere întregi, în mod clar.
Aici este ultima linie, deși.
Dacă spun PK = & k, stai, ce sa întâmplat, nu?
Deci, acest număr aleator, aparent aleator numărul, se aruncat în caseta de acolo.
Tot ceea ce este, este PK primeste adresa de k.
Deci, eu sunt lipit în cazul în care k locuiește în memorie, adresa, adresa de bytes sale.
Tot ce fac este să spun că este ceea ce valoare am de gând
pentru a pune în interiorul caseta mea a sunat PK.
Și pentru că aceste lucruri sunt indicii, și pentru că în căutarea
la un șir de zero ca X opt la zero c șapte patru opt
doi de zero este, probabil, nu foarte semnificativ.
Când ne-am vizualiza general indicii, am de fapt, acest lucru ca indicii.
PK ne oferă informații trebuie să găsim k în memorie.
Deci, practic PK are o săgeată în el.
Și dacă umblăm lungimea de care săgeată, imaginați-vă
e ceva ce se poate merge pe, dacă de mers pe jos de-a lungul săgeții,
chiar la vârful săgeții pe care, noi va găsi locația în memorie
unde k locuiește.
Și asta e foarte important pentru că odată ce știm unde locuiește K,
putem începe să lucreze cu datele în interiorul acestui locație de memorie.
Deși primim o Teeny bit înainte de noi înșine pentru acum.
>> Deci, ce este un pointer?
Un pointer este un element de date a cărui valoare nu este o adresă de memorie.
Asta a fost că de zero x opt lucruri la zero întâmplă, asta a fost o adresă de memorie.
Asta a fost o locație în memorie.
Și tipul unei pointer descrie natura
de datele pe care le veți găsi la acea adresă de memorie.
Deci nu e de partea dreaptă stea Int.
Dacă am urma ca sageata, e O să mă conducă la o locație.
Și acea locație, ceea ce am vor găsi acolo, în exemplul meu,
este o cutie de culoare verde.
E un număr întreg, asta e ceea ce am veți găsi, dacă mă duc la acea adresă.
Tipul de date al unui pointer descrie ceea ce
veți găsi la acea adresă de memorie.
Deci, aici e lucru foarte cool, deși.
Indicii ne permit sa treaca variabile între funcții.
Și de fapt, trece variabile și nu trece copii ale acestora.
Pentru că dacă știm exact unde în memorie pentru a găsi o variabilă,
nu avem nevoie pentru a face o copie a aceasta, putem merge doar la acea locație
și de a lucra cu acea variabilă.
Deci, în esență indicii fel de a face un mediu de calculator
mai mult ca lumea reală, nu.
>> Deci, aici este o analogie.
Să spunem că am un notebook, drept, și este plin de note.
Și aș dori să-l actualizați.
Ești o funcție care actualizări note, dreapta.
În modul în care am fost de lucru până în prezent, ceea ce
se întâmplă este va lua notebook-mea, veți merge la magazin de copiere,
veți face o copie xerox a fiecare pagină a notebook-ului.
Vei lăsa notebook înapoi pe biroul meu atunci când ați terminat,
veți merge și cruce lucruri în mea notebook care sunt depășite sau greșite,
și apoi veți trece înapoi la mi teancul de pagini Xerox
că este o replica de notebook mea cu modificările pe care le-ați făcut să-l.
Și în acel moment, este de până la mine, ca funcția de apelare, cum apelantului,
pentru a decide să ia notițe si integrarea lor înapoi în caietul meu.
Deci, există o mulțime de pași implicat aici, chiar.
Ca nu ar fi mai bine dacă spun doar, hei, poți
actualiza notebook-ul meu pentru ma, tu dai caietul meu,
și luați lucrurile și literalmente le tăiați
și actualizează notele mele în caietul meu.
Și apoi dă-mi notebook înapoi.
Asta e un fel de ceea ce indicii ne permit să facem,
ei fac acest mediu mult mai mult ca modul în care ne desfășurăm activitatea în realitate.
>> Bine Deci asta un pointer este, hai sa vorbim
despre modul în care indicii de lucru în C, și cum putem începe să lucreze cu ei.
Deci, există un indicator foarte simplu în C numit indicatorul nul.
Nulul indicatorul la nimic.
Probabil pare ca e de fapt, nu este un lucru foarte util,
dar vom vedea o puțin mai târziu, faptul
că acest pointer null de fapt, într-adevăr poate veni la îndemână.
Și ori de câte ori creați un pointer, și nu setați immediately- sa valoare
un exemplu de setare valoarea sa imediat
va fi un cuplu diapozitive înapoi în cazul în care am spus PK egal & K,
PK devine adresa k lui, ca vom vedea ce înseamnă că,
vom vedea cum să cod care shortly- dacă nu setați valoarea sa la ceva
semnificativ imediat, trebuie întotdeauna
setați indicatorul pentru a indica null.
Tu ar trebui să stabilească o pentru a indica nimic.
>> Asta e foarte diferit de lăsând doar valoarea cum este
și apoi declararea unei pointer și doar asumarea
este nul pentru că rareori adevărat.
Așa că ar trebui să stabilească întotdeauna valoarea unui pointer
la null daca nu setați valoarea sa la ceva semnificativ imediat.
Puteți verifica dacă valoarea unui pointer de este nul folosind operatorul de egalitate
(==), La fel ca veți compara orice întreg valori sau valori de caractere utilizând (==)
deasemenea.
E un fel special de constant Valoarea pe care o puteți utiliza pentru a testa.
Deci, asta a fost o foarte simplu pointer, indicatorul nul.
Un alt mod de a crea un pointer este de a extrage
adresa unei variabile deja le-ați creat,
și face acest lucru folosind & extracție adresa operatorului.
Care le-am văzut deja anterior în primul exemplu diagrama-am arătat.
Deci, dacă X este o variabilă care l-am deja creat de tip întreg,
atunci și X este un pointer la un întreg.
& X este- amintesc, si se va pentru a extrage adresa de lucru pe dreapta.
Si din moment ce un indicator este doar o adresă, decât & X este un pointer la un întreg
a căror valoare nu este în cazul în care în memorie x viața.
E adresa lui x.
Deci & x este adresa lui x.
Să luăm această un pas în continuare și conectarea la ceva
Am făcut aluzie la un videoclip în prealabil.
Dacă arr este o serie de camere duble, atunci & Suport pătrat ARR i este un pointer
la o dublă.
BINE.
arr suport pătrat I, în cazul în care arr este o serie de camere duble,
apoi arr suport pătrat i este elementul i din care matrice,
și & arr suport pătrat i este în cazul în care în Memoria elementul i din ARR există.
>> Deci, ce este implicarea aici?
Un nume matrice, implicarea din toată chestia asta,
este că numele o matrice este de fapt, el însuși un pointer.
Ai lucrat cu indicii de-a lungul
de fiecare dată când ați folosit un tablou.
Amintiți-vă de la exemplul pe domeniul de aplicare variabil,
aproape de sfârșitul video prezint un exemplu în cazul în care avem o funcție
numit set Int și o funcție numită set matrice.
Și provocarea ta pentru a determina sau nu, sau ceea ce
Valorile pe care le imprimate pe sfârșitul funcției,
la sfârșitul programului principal.
>> Dacă vă amintiți de la acel exemplu sau dacă ați vizionat video,
Știi că atunci când vi-apelul la set Int nu face în mod eficient nimic.
Dar apelul de a stabili matrice face.
Și am un fel de glosat peste ce că a fost cazul, la momentul.
Tocmai am spus, bine este o matrice, este special, știi, există un motiv.
Motivul este că o serie de Numele este de fapt doar un pointer,
și nu există acest special sintaxă suport pătrat care
face lucrurile mult mai frumos o de a lucra cu.
Și ei fac ideea de pointer mult mai puțin intimidant,
și de aceea sunt un fel de prezentat în acest fel.
Dar de fapt matrice sunt doar indicative.
Și de aceea, atunci când ne-am a făcut o schimbare la matrice,
când am trecut un tablou ca un parametru pentru o funcție sau ca un argument
la o funcție, conținutul șirului schimbat de fapt atât în ​​callee
și în apelantul.
Care, pentru orice alt tip de variabilă am văzut nu a fost cazul.
Deci asta e doar ceva pentru a păstra în minte atunci când lucrați cu indicii,
este faptul că numele unui matrice de fapt un pointer
la primul element de care matrice.
>> OK asa ca acum avem toate aceste fapte, să continuăm, chiar.
De ce nu ne pasă de în cazul în care ceva locuiește.
Ei bine, cum am spus, e destul de util să știm unde locuiește ceva
astfel încât să puteți merge acolo și să îl modificați.
Lucra cu el și de fapt au un lucru pe care
vrei să faci în acest sens ia variabilă, și nu produce efecte de la unele copie a acesteia.
Aceasta se numește dereferencing.
Mergem la referință și vom schimba valoarea acolo.
Deci, dacă avem un pointer si se numeste PC-ul, și puncte de la un personaj,
atunci putem spune * * PC și PC-ul este Numele de ceea ce vom găsi dacă vom merge
la PC adresa.
Ce vom găsi acolo este un personaj și * PC-ul este cum ne referim la datele la care
locație.
Deci, am putea spune ceva de genul * pc = D sau ceva de genul asta,
și asta înseamnă că orice a fost la adresa de memorie PC-ul,
indiferent de caracterul a fost anterior există, este acum D, dacă spunem * pc = D.
>> Deci, aici vom merge din nou cu unele C chestii ciudate, chiar.
Deci am vazut * anterior ca fiind într-un fel o parte din tipul de date,
iar acum este folosit în un context puțin diferit
pentru a accesa datele într-o locație.
Știu că e un pic confuz și Asta este de fapt o parte a acestui întreg
cum ar fi, de ce indicii au această mitologie în jurul lor ca fiind atât de complex,
este un fel de o problemă de sintaxă, sincer.
Dar * este folosit în ambele contexte, atât ca parte a numelui de tip,
si vom vedea un pic mai târziu ceva, de asemenea.
Iar acum este operator de dereference.
Deci, merge la referință, se accesează datele
la locul de indicatorul, și vă permite să-l manipuleze după bunul plac.
>> Acum acest lucru este foarte similar cu vizita pe aproapele tău, chiar.
Dacă știi ce dvs. vecin locuiește, ești
nu stau cu aproapele tău.
Știi că se întâmplă să știu unde trăiesc,
dar asta nu înseamnă că de virtutea de a avea cunoștințe care
vi se interacționează cu ei.
Dacă doriți pentru a interacționa cu ei, trebuie să te duci la casa lor,
trebuie să te duci la locul în care trăiesc.
Și odată ce ai făcut asta, atunci puteți interacționa
cu ei la fel ca ai vrea sa.
În mod similar și cu variabile, aveți nevoie pentru a merge la adresa lor
dacă vrei să le interacționeze, nu se poate ști doar adresa.
Și modul în care te duci la adresa este să utilizeze *, operatorul dereference.
Ce crezi că se întâmplă dacă vom încerca și dereference
un pointer a carui valoare este nulă?
Amintiti-va ca nul pointer indică nimic.
Deci, dacă încercați și dereference nimic sau du-te la o adresă nimic,
ce crezi că se întâmplă?
Segmentarea Ei bine, dacă ai ghicit vina, ai avea dreptate.
Dacă încercați și dereference un pointer nul,
suferi o segmentare vina. Dar asteapta,
Nu ți-am spus că dacă nu te duci
pentru a seta valoarea ta de dvs. pointer la ceva semnificativ,
tu ar trebui să stabilească la null?
Am făcut-o și de fapt segmentarea vina este un fel de un comportament bun.
>> Ai declarat vreodată o variabilă și nu atribuie valoarea imediat?
Deci, ai spus int x; tu nu de fapt, nimic atribuie
și apoi mai târziu în codul dvs., imprimați din valoarea lui x,
care nu au încă atribuit-l la ceva.
Frecvent veți obține la zero, dar uneori
s-ar putea obține unele numere aleatorii, și aveți nici o idee de unde a venit de la.
În mod similar se poate lucruri intampla cu indicii.
Când declara un pointer int * PK de exemplu,
și nu-l atribuie o valoare, te patru octeți pentru memorie.
Oricare ar fi patru bytes de Memoria sistemul poate
constată că au o anumită valoare semnificativă.
Și nu ar fi putut fi ceva deja acolo, care
nu mai este necesar un alt funcție, astfel încât doar ai
indiferent de datele a fost acolo.
>> Ce se întâmplă dacă ai încercat să faci dereference unii adresa pe care le don't- au fost
deja octeți și informații în acolo, asta e acum în indicatorul.
Dacă încercați și dereference că pointer, s-ar putea să joci cu unele de memorie
că nu a intenționat să te pui cu totul.
Și, de fapt ai putea face ceva cu adevarat devastator,
ca rupe un alt program, sau de a sparge o altă funcție,
sau de a face ceva rău intenționat care nu ai de gând să faci, la toate.
Și astfel că de aceea este de fapt o idee bună
pentru a seta indicii pentru a null dacă nu le setat la ceva semnificativ.
Probabil e mai bine la sfârșitul zilei pentru programul
sa se prabuseasca apoi pentru ea să facă Ceva care șuruburi până
un alt program sau o altă funcție.
Că un comportament este, probabil, chiar mai mult decât ideală crashing.
Și astfel că de aceea este de fapt un obicei bun
pentru a intra în a stabili indicii dvs. la null daca nu le setați
la o valoare semnificativă imediat, o valoare care știți că
și că puteți în condiții de siguranță dereference.
>> Deci, haideți să vină înapoi acum și să ia o privire la sintaxa generală a situației.
Dacă spun int * p ;, ceea ce am făcut doar?
Ce am făcut asta.
Știu valoarea p este o adresă deoarece toate indicii sunt doar
adrese.
Pot dereference p folosind operatorul *.
În acest context aici, chiar la top amintim * face parte din tipul.
Int * este tipul de date.
Dar pot dereference p folosind operatorul *,
și, dacă am face acest lucru, dacă mă duc la acea adresă, ceea ce voi găsi la acea adresă?
Voi găsi un număr întreg.
Deci int * p este de fapt spunând, p este o adresă.
Pot dereference p și dacă Eu fac, voi găsi un număr întreg
la acea locație de memorie.
>> OK, așa că am spus că a fost un alt lucru enervant cu stele
și aici este cazul în care acest lucru enervant cu stele este.
Ați încercat vreodată să declare mai multe variabile de același tip
pe aceeași linie de cod?
Deci, pentru un al doilea, pretinde că linia, codul de fapt, am acolo în verde
nu este acolo și spune doar int x, y, z ;.
Ce care ar face este de fapt crearea trei variabile întregi pentru tine,
unul numit x, unul numit y, și unul numit z.
Este un mod de a face acest lucru fără având de a împărți pe trei linii.
>> Iată unde stars obține enervant din nou, deși,
deoarece este de fapt parte * atât a numelui de tip și o parte
a numelui variabilei.
Și așa că, dacă spun px int *, py, PZ, ceea ce am de fapt obține este un pointer la un întreg
numit px și două numere întregi, Py și PZ.
Și că, probabil, nu ceea ce este vrem, asta nu e bine.
>> Deci, dacă vreau să creați mai multe indicii pe aceeași linie, de același tip,
și stele, ceea ce de fapt am nevoie să faceți este să spun int * pa, * Pb, * PC-ul.
Acum, după ce tocmai a spus că și acum spun asta,
probabil nu va face acest lucru.
Și este, probabil, un lucru bun sincer, pentru că s-ar putea din greșeală
omite o stea, ceva de genul asta.
Este probabil cel mai bine să o declare poate indicii pe liniile individuale,
dar e doar o alta din cei sintaxă enervant
lucruri cu stele care fac indicii atât de dificil de a lucra cu.
Pentru că e doar acest sintactic mizerie trebuie să lucreze prin intermediul.
Cu practica face deveni cu adevărat oa doua natura.
Eu încă fac greșeli cu tot după programare timp de 10 ani,
asa ca nu fi supărat dacă se întâmplă ceva pentru tine, e destul de comun sincer.
Este într-adevăr un fel de un defect de sintaxa.
>> OK, așa că am un fel de promis care ne-ar revizui
conceptul de cât de mare este un șir.
Ei bine, dacă ți-am spus că o string, am într-adevăr un fel de
mințit pentru a vă tot timpul.
Nu e nici un tip de date numit șir, și, de fapt am
menționat acest lucru în unul dintre noastre primele clipuri video pe tipuri de date,
care șir a fost un tip de date care a fost creat pentru tine în CS50.h.
Trebuie să #include CS50.h în scopul de a utiliza.
>> Ei bine, string este de fapt doar un alias pentru ceva
numit char *, un pointer la un caracter.
Ei bine indicii, rechemare, sunt doar adrese.
Deci, ce este de dimensiunea în bytes de un șir?
Ei bine, e de patru sau opt.
Și motivul pentru care am spus patru sau opt este pentru că de fapt
depinde de sistemul, Dacă utilizați CS50 IDE, char * este de marimea unui caracter
* Este de opt, este un sistem pe 64 de biți.
Fiecare adresă în memorie este 64 de biți lung.
Dacă utilizați aparatul CS50 sau folosind orice mașină pe 32 de biți,
și ați auzit că pe termen de 32 de biți mașină, ceea ce este o mașină pe 32 de biți?
Ei bine, aceasta înseamnă doar că fiecare adresă în memorie este 32 de biți lung.
Și așa 32 de biți este de patru octeți.
Deci, un char * este de patru sau opt octeți în funcție de sistemul dumneavoastră.
Și într-adevăr orice tipuri de date, și un pointer la orice date
tip, deoarece toate indicii sunt doar Adresele, patru sau opt octeti.
Deci, haideți să reexamineze această diagramă și să încheie
acest videoclip cu un mic exercițiu aici.
Deci, aici e schema am rămas cu la începutul videoclipului.
Deci, ce se întâmplă acum în cazul în care spun * PK = 35?
Deci, ce înseamnă când spun, * PK = 35?
Ia-o a doua.
* pk.
În context aici, * este operator de dereference.
Deci, atunci când dereference Operatorul este utilizat,
mergem la adresa indicat de PK, și vom schimba ceea ce vom găsi.
Deci * PK = 35 mod eficient face acest lucru pentru a fotografia.
Deci este practic punct de vedere sintactic identic cu a fi spus k = 35.
>> Încă una.
Dacă spun Int m, creez o nouă variabilă numită m.
O nouă cutie, este o cutie verde, deoarece se va ține un întreg,
și este etichetat m.
Dacă spun m = 4, am pus un întreg în cutia.
Dacă zice PK = & m, cum se această schimbare diagrama?
Pk = & m, nu vă amintiți Ce & Operatorul are sau se numește?
Amintiți-vă că și unele nume de variabilă este adresa unui nume de variabilă.
Deci, ceea ce spui este PK devine adresa m.
Și atât de eficient ce se întâmplă în Diagrama este că pk puncte nu mai
pentru k, dar puncte la m.
>> Din nou, indicii sunt foarte dificil de a lucra cu
și ei să ia o mulțime de practică, ci pentru că
de capacitatea lor de a vă permite pentru a trece de date între funcțiile
și de fapt au cele schimbări în vigoare,
obtinerea capul în jurul valorii de este foarte important.
Este, probabil, este cel mai complicat subiect vom discuta în CS50,
dar valoarea pe care obține de la utilizarea indicii
depășește cu mult complicațiile care vin de la ei de învățare.
Deci vă doresc cel mai bun de noroc de învățare despre indicii.
Sunt Doug Lloyd, aceasta este CS50.