[Powered by Google Translate] [4.pants - ērtāk]
[Rob Bowden - Hārvarda]
[Tas ir CS50. - CS50.TV]
Mums ir viktorīna rīt, ja jūs puiši nav jāzina.
Tā būtībā uz visu, jūs varētu būt redzējis klasē vai ir redzējuši klasē.
Tas ietver norādes, lai gan viņi ir ļoti nesen tēmu.
Jums vajadzētu vismaz saprast augstu viņiem.
Jebkas, kas bija devusies vairāk nekā klasē, jums vajadzētu saprast, par viktorīnas.
Tātad, ja jums ir jautājumi par tiem, jūs varat lūgt viņiem tagad.
Bet tas būs ļoti students vadītā sesija, kur jūs puiši uzdot jautājumus,
tāpēc cerams cilvēki ir jautājumi.
Vai kāds ir jautājumi?
Jā. >> [Students] Vai jums iet pa šautru atkal?
Es iešu pa šautru.
Visas jūsu mainīgo vienmēr dzīvo atmiņā,
bet parasti jums nav jāuztraucas par to un jūs vienkārši pateikt x + 2 un y + 3
un kompilators izdomāt, kur lietas dzīvo jums.
Kad jums ir darīšana ar norādes, tagad tu esi precīzi, lietojot šos atmiņas adreses.
Tātad viena mainīgā būs tikai kādreiz dzīvot vienā adresē jebkurā laikā.
Ja mēs vēlamies atzīt rādītāju, kas ir veids gatavojas izskatās?
>> Es gribu atzīt rādītāju p. Kāda veida izskatās?
[Students] int * p. >> Jā. Tātad int * p.
Un kā es varu darīt to norādīt uz X? >> [Students] & zīmi.
[Bowden] Tātad zīme & ir burtiski sauc adresi operatora.
Tātad, kad es saku & x tas kļūst atmiņas adresi mainīgā x.
Tāpēc tagad man ir rādītāju p, un visur manā kods es varētu izmantot * p
vai es varētu izmantot x un tas būs tieši tas pats.
(* P). Kas ir šī dara? Ko tas zvaigzne nozīmē?
[Students] Tas ir vērtība šajā punktā. >> Jā.
Tātad, ja mēs skatāmies uz to, tas var būt ļoti noderīga, lai izvilkt diagrammas
ja tas ir mazliet kaste atmiņā X, kas notiek, ir vērtība 4,
tad mums ir maz kaste atmiņas par p,
un tā p norāda uz X, tāpēc mēs izdarīt bultiņu no P līdz x.
Tātad, kad mēs sakām * p mēs sakot iet uz lodziņu, kas ir p.
Star ir sekot bultiņas un pēc tam darīt, ko vien vēlaties ar šo lodziņu tiesības tur.
Tāpēc es varu teikt * p = 7, un kas dosies uz kastes, kas ir X un pārmaiņas, kas līdz 7.
Vai es varētu teikt int z = * p * 2; Tas ir mulsinoši, jo tas ir zvaigzne, zvaigzne.
Viena zvaigzne ir dereferencing p, otra zvaigzne reizinot ar 2.
Paziņojums Es varētu būt tikpat labi aizstāja * P ar x.
Jūs varat izmantot tos tādā pašā veidā.
Un tad vēlāk es varētu būt p norāda uz pilnīgi jauna lieta.
Es varu tikai teikt p = &z;
Tāpēc tagad p vairs nav vietas uz X, tas norāda uz z.
Un jebkurā laikā man * P tas pats, kas dara z.
Tāpēc noderīga lieta par šo ir, kad mēs sāktu nokļūst funkcijām.
>> Tas ir sava veida bezjēdzīgi atzīt rādītāju, kas norāda uz kaut ko
un tad jūs vienkārši dereferencing to
ja jūs varētu būt izmantoti sākotnējā mainīgo sākt ar.
Bet, kad jūs nokļūt funkcijām - tāpēc pieņemsim, ka mums ir dažas funkcijas, int foo,
kas ņem rādītāju un tikai dara * p = 6;
Tāpat kā mēs redzējām pirms ar swap, jūs nevarat izdarīt efektīvu swap un atsevišķu funkciju
, tikai iet integers, jo viss, kas C vienmēr iet pēc vērtības.
Pat tad, kad jūs iet norādes jūs iet pēc vērtības.
Tas tikai tā notiek, ka šīs vērtības ir atmiņas adreses.
Tātad, kad es saku foo (p), es esmu iet rādītāju uz funkciju foo
un tad foo dara * p = 6;
Tātad iekšā šī funkcija, * p ir vēl līdzvērtīgs x,
bet es nevaru izmantot X iekšā šī funkcija, jo tas nav scoped laikā šo funkciju.
Tātad * p = 6 ir vienīgais veids, kā es varētu piekļūt vietējo mainīgais no citas funkcijas.
Vai, labi, norādes ir vienīgais veids, kā es varētu piekļūt vietējo mainīgais no citas funkcijas.
[Students] Teiksim, jūs gribēja atgriezties rādītāju. Kā tieši jūs darīt?
[Bowden] Atgriešanās rādītāju kā kaut ko līdzīgu int y = 3; atgriešanās & y? >> [Students] Jā.
[Bowden] Labi. Jums nekad nevajadzētu darīt. Tas ir slikti.
Es domāju, ka es redzēju šo lekciju slaidos jūs sāku redzēt šo visu diagrammu atmiņas
kur šeit jūs esat ieguvuši atmiņas adrese 0
un uz leju šeit jums ir atmiņas adrese 4 gigs vai 2 32.
Tātad, tad jūs esat ieguvuši dažas lietas un daži sīkumi, un tad jums ir kaudze
un jūs esat ieguvuši savu kaudze, kuru jūs tikko sāku mācīties par, aug.
[Students] nav kaudze virs kaudze?
>> Yeah. Kaudze ir uz augšu, vai ne? >> [Students] Nu, viņš likts 0 uz augšu.
[Students] Ak, viņš likts 0 uz augšu. >> [Students] Ak, labi.
Atruna: Anywhere ar CS50 jūs dodas, lai redzētu to tā. >> [Students] Labi.
Tas ir tikai, ka tad, kad jūs pirmo reizi redzēt skursteņi,
piemēram, kad jūs domājat par kaudze jūs domājat par kraušanas lietas viens uz otru.
Tāpēc mums ir tendence uzsist tas apmēram tā kaudze aug kā kaudze parasti,
vietā kaudze karājas uz leju. >> [Students] nav kaudzes tehniski aug pārāk, lai gan?
Tas atkarīgs no tā, ko tu domā ar aug.
Kaudze un kaudze vienmēr augt pretējos virzienos.
Kaudze vienmēr aug tādā ziņā, ka tas aug
uz augstākas atmiņas adreses un kaudze aug uz leju
jo tas aug uz zemāku atmiņas adreses.
Tātad top ir 0 un apakšā ir augstas atmiņas adreses.
Viņi abi aug, tikai pretējos virzienos.
[Students] Es tikai nozīmē, ka tāpēc, ka jūs teicāt, ka likts kaudze uz grunts
jo tas šķiet vairāk intuitīvi, jo, lai kaudze sākt augšpusē kaudzes,
kaudze ir uz augšu sevi pārāk, tāpēc That - >> Jā.
Jūs arī domāt par kaudzes kā aug un lielāks, bet kaudze vairāk.
Tātad kaudze ir viens, ka mēs veida vēlamies parādīt aug.
Bet visur izskatās citādi gatavojas parādīt adrese 0 augšā
un augstākā atmiņas adrese apakšā, tāpēc tas ir jūsu parastā viedoklis par atmiņu.
>> Vai jums ir jautājums?
[Students] Vai varat pastāstīt mums vairāk par kaudzes?
Yeah. Es nopirkšu ka sekundē.
Pirmkārt, dodas atpakaļ uz to, kāpēc atgriešanās & Y ir slikti,
uz skursteņa jums ir ķekars kaudze rāmji, kas pārstāv visas funkcijas
kas ir saukta.
Tāpēc ignorējot iepriekšējās lietas, jūsu kaudze augšas vienmēr būs galvenā funkcija
jo tas ir pirmais funkcija, kas tiek saukta.
Un tad, kad jūs izsauktu citu funkciju, kaudze gatavojas augt uz leju.
Tātad, ja es aicinu kādu funkciju, foo, un tas izpaužas sava steka rāmi,
tā var zvanīt kādu funkciju, bāru, tas izpaužas sava steka rāmi.
Un josla varētu būt rekursīvs un tas varētu zvanīt pati,
un tādējādi otrais aicinājums uz bāru gatavojas saņemt savu steka rāmi.
Un tā, kas notiek šajās kaudze rāmji ir visas vietējās mainīgo
un visi funkciju argumentiem, ka -
Jebkuras lietas, kas ir lokāli scoped uz šo funkciju iet šajās kaudze rāmjos.
Tātad tas nozīmē, kad es teicu kaut ko līdzīgu bārā ir funkcija,
Es esmu tikai gatavojas pasludināt skaitlim un tad atgriezties rādītāju uz šo skaitlim.
Tātad, ja tas y dzīvo?
[Students] y dzīvo bārā. >> [Bowden] Jā.
Kaut kur šajā maz laukumā atmiņa ir Littler kvadrātveida, kas ir y tajā.
Kad es atgriežos & Y, es esmu atpakaļ rādītāju šim maz bloka atmiņu.
Bet tad, kad funkcija atgriež, tā kaudze rāmis izpaužas popped off kaudze.
Un tas ir iemesls, kāpēc to sauc kaudze.
Tas ir tāpat kā kaudze datu struktūra, ja jūs zināt, kas tas ir.
Vai pat kā kaudze paplātēm vienmēr ir piemērs,
Galvenais ir gatavojas iet uz leju, tad pirmais uzdevums jums zvanīt, ir gatavojas iet uz augšu, ka,
un jūs nevarat saņemt atpakaļ uz galveno kamēr esat atgriezies no visām funkcijām, kas ir saukta
kas ir novietoti uz augšu no tā.
>> [Students] Tātad, ja jūs darīt atgriezties & Y, ka vērtība var tikt mainīta bez iepriekšēja brīdinājuma.
Jā, it's - >> [students] Tā varētu būt pārrakstīts. >> Jā.
Tas ir pilnīgi - Ja jūs mēģināt un -
Tas arī būtu int * bar, jo tas atgriežas rādītāju,
tāpēc tās atgriešanās tips ir int *.
Ja jūs mēģināt izmantot atgriešanās vērtību šo funkciju, tas ir nenoteikts uzvedība
tāpēc, ka rādītājs norāda uz sliktu atmiņu. >> [Students] Labi.
Tātad, ko tad, ja, piemēram, jums paziņoja int * y = malloc (sizeof (int))?
Tas ir labāk. Jā.
[Students] Mēs runājām par to, kā tad, kad mēs velciet lietas mūsu recycle bin
viņi nav reāli izdzēsti, mēs vienkārši zaudēt savas norādes.
Tātad šajā gadījumā mēs faktiski izdzēst vērtību vai tas joprojām tur atmiņā?
Attiecībā uz lielāko daļu, tas būs vēl tur.
Bet pieņemsim, ka mēs izsaucat kādu citu funkciju, baz.
Baz gatavojas saņemt savu steku rāmi šeit.
Tas būs pārrakstot visu šo stuff,
un tad, ja jūs vēlāk mēģināt izmantot rādītāju ka jums pirms,
tas nav būs pati vērtība.
Tas notiek, ir mainījusies tikai tāpēc, ka jūs sauc funkciju BAZ.
[Students] Bet, ja mēs ne, vai mēs joprojām iegūt 3?
[Bowden] Visticamāk, jūs.
Bet jūs nevarat paļauties uz to. C vienkārši saka nedefinētiem uzvedību.
>> [Students] Ak, tā dara. Labi.
Tātad, ja jūs vēlaties, lai atgrieztos rādītāju, tas ir, ja malloc nāk izmantošanu.
Es esmu rakstot faktiski tikai atgriezties malloc (3 * sizeof (int)).
Mēs iet pār malloc vairāk otrkārt, bet malloc ideja ir visas jūsu vietējās mainīgie
vienmēr iet uz skursteņa.
Jebkas, kas ir malloced iet uz kaudzes, un tas būs mūžīgi un vienmēr būs par kaudzes
līdz skaidri atbrīvotu to.
Tātad tas nozīmē, ka tad, kad jūs malloc kaut ko, tas notiek, lai izdzīvotu pēc funkciju atdevi.
[Students] Vai tā izdzīvot pēc programma pārstāj darboties? >> Nr
Labi, tā tas būs tur līdz programma ir visu ceļu darīts darbojas. >> Jā.
Mēs varam iet pa ziņas par to, kas notiek, kad programma pārstāj darboties.
Jums var būt nepieciešams, lai atgādinātu man, bet tas ir atsevišķs lieta pilnībā.
[Students] Tātad malloc rada rādītāju? >> Jā.
Malloc - >> [students] Es domāju malloc apzīmē bloku atmiņas ka rādītāju var izmantot.
[Bowden] Es gribu, ka diagramma vēlreiz. >> [Students] Tātad šī funkcija darbojas, lai gan?
[Students] Jā, malloc apzīmē bloku atmiņas, kas jūs varētu izmantot,
un tad tas atgriež adresi pirmā bloka šīs atmiņas.
>> [Bowden] Jā. Tātad, ja jūs malloc, jūs satveršanas kādu bloku atmiņas
kas ir pašlaik kaudzē.
Ja kaudze ir pārāk mazs, tad kaudze ir tikai gatavojas augt, un tas aug šajā virzienā.
Tāpēc pieņemsim, ka kaudze ir pārāk mazs.
Tad tas ir par augt mazliet un atgriezties rādītāju uz šo bloku ka tikai pieauga.
Kad jūs bezmaksas stuff, jūs gūstat vairāk vietas kaudzes,
tā tad vēlāk zvanīt malloc var atkārtoti ka atmiņas, kas jums bija agrāk atbrīvoja.
Svarīga lieta par malloc un bezmaksas ir, ka tas dod jums pilnīgu kontroli
dzīves laikā šo atmiņas bloku.
Global mainīgie ir vienmēr dzīvs.
Vietējās mainīgie ir dzīvs to darbības jomā.
Tiklīdz jūs iet garām cirtaini lencēm, vietējās mainīgie ir miruši.
Malloced atmiņa ir dzīvs, kad jūs vēlaties, lai to dzīvs
un tad tiek atbrīvots, ja jums pateikt to atbrīvo.
Tie ir faktiski tikai 3 veidu atmiņas, tiešām.
Ir automātiska atmiņas pārvaldība, kas ir kaudze.
Lietas notiek automātiski.
Kad jūs sakāt int x, atmiņa ir piešķirti int x.
Ja x iet no jomas, atmiņa ir reģenerēts uz X.
Tad tur ir dinamiska atmiņas vadību, kas ir tas malloc ir,
kas ir, kad jums ir kontrolēt.
Jūs dinamiski izlemt, ja atmiņā vajadzētu un ko nevajadzētu piešķirt.
Un tad tur ir statisks, kas nozīmē tikai to, ka tā dzīvo mūžīgi,
kas ir tas, ko globālie mainīgie.
Viņi vienkārši vienmēr atmiņā.
>> Jautājumi?
[Students] Vai jūs definētu bloku tikai izmantojot cirtaini bikšturi
bet, kam nav, lai būtu, ja paziņojumā vai kamēr paziņojums vai kaut kas tamlīdzīgs?
Jūs varat definēt bloku kā funkciju, bet tas ir cirtaini lencēm pārāk.
[Students] Tātad jūs nevarat vienkārši ir kā izlases pāris cirtaini bikšturi savu kodu
ka ir vietējo mainīgie? >> Jā, jūs varat.
Iekšpusē int bar mēs varētu būt {int y = 3;}.
Tai vajadzēja būt šeit.
Bet tas pilnīgi nosaka tās piemērošanas jomu int y.
Pēc šī otrā cirtaini lencēm, y nevar izmantot vairs.
Jūs gandrīz nekad darīt, lai gan.
Getting atpakaļ uz to, kas notiek, kad programma beidzas,
tur ir sava veida nepareizs / pusi meliem, ka mēs piešķiram, lai tikai padarītu lietas vieglāk.
Mēs jums pateikt, ka tad, kad jūs piešķirt atmiņu
jūs piešķirot kādu gabalu no RAM šim mainīgajam.
Bet jūs neesat īsti tieši pieskaras RAM kādreiz jūsu programmas.
Ja jūs domājat par to, kā es vērsa -
Un tiešām, ja jūs iet cauri gdb jūs redzēsiet to pašu.
Neatkarīgi no tā, cik reizes jūs palaist savu programmu vai ko programma jūs strādājat,
kaudze vienmēr gatavojas sākt -
jūs vienmēr gatavojas redzēt mainīgos ap adrešu oxbffff kaut.
Tas parasti kaut kur šajā reģionā.
Bet kā var 2 programmas, iespējams, ir norādes uz to pašu atmiņu?
[Students] Ir daži patvaļīgi apzīmējums kur oxbfff ir vajadzēja būt par RAM
kas faktiski var būt dažādās vietās atkarībā no tā, kad funkcija tika saukta.
Yeah. Termins ir virtuālā atmiņa.
Ideja ir tāda, ka katrs process, katru programmu, kas darbojas jūsu datorā
ir sava - pieņemsim 32 bitus - pilnīgi neatkarīga adrešu.
Tas ir adrešu.
Tai ir savi pilnīgi neatkarīgu 4 gigabaitus izmantot.
>> Tātad, ja jūs darbināt 2 programmas vienlaicīgi, šī programma redz 4 gigabaitus uz sevi,
Šī programma redz 4 gigabaitus uz sevi,
un tas ir neiespējami, lai šīs programmas dereference rādītājs
un galu galā ar atmiņu no šīs programmas.
Un kāda virtuālā atmiņa ir ir kartēšanas no procesiem adrešu
faktiskajiem lietas par RAM.
Tāpēc tas ir līdz jūsu operētājsistēmu zināt, ka,
hei, kad šis puisis dereferences rādītājs oxbfff, kas tiešām nozīmē
ka viņš vēlas RAM baits 1000,
tā kā, ja šī programma dereferences oxbfff, viņš tiešām grib RAM baitu 10000.
Tie var būt patvaļīgi tālu viena no otras.
Tas ir pat taisnība lietas vienā procesu adrešu.
Tātad, piemēram, tas redz visus 4 gigabaitu uz sevi, bet, teiksim -
[Students] Vai katru procesu -
Pieņemsim, ka jums ir dators ar tikai 4 gigabaitu RAM.
Vai katru procesu redzēt visu 4 gigabaitus? >> Jā.
Bet 4 gigabaitiem tas redz ir meli.
Tas ir tikai tā domā, ka ir visas šīs atmiņas, jo tas nezina citu process pastāv.
Tas būs tikai izmantot tik daudz atmiņas, kā tas faktiski ir nepieciešama.
Operētājsistēma nav gatavojas sniegt RAM šajā procesā
ja tas nav, izmantojot jebkuru atmiņu šajā visā reģionā.
Tas nav gatavojas sniegt tai atmiņas par šo reģionu.
Bet ideja ir tāda, ka - es cenšos domāt par - es nevaru domāt par analoģijas.
Analoģijas ir grūti.
Viens no virtuālās atmiņas jautājumiem vai no lietām tas atrisināt vienu
ir tāds, ka procesi būtu pilnīgi informēti par vienu citu.
Un tā jūs varat rakstīt jebkuru programmu, kas tikko dereferences any rādītājs,
patīk vienkārši uzrakstīt programmu, kas saka * (ox1234),
un tas, dereferencing atmiņas adrese 1234.
>> Bet tas ir atkarīgs no operētājsistēmas, lai pēc tam tulkot kādi 1234 līdzekļus.
Tātad, ja 1234 notiek, ir derīga atmiņas adrese šim procesam,
kā tas ir uz skursteņa vai kaut ko, tad tas atgriezīsies vērtību, kas atmiņas adresi
ciktāl process zina.
Bet, ja 1234 nav derīga adrese, līdzīgi kā tas notiek ar zemes
kādā maz gabals no atmiņas šeit, ka ir aiz kaudze un aiz kaudzes
un jums nav īsti lietot, ka tad tas ir tad, kad jūs iegūtu lietas, piemēram segmentācijas kļūdas
jo jūs esat pieskaras atmiņu ka jums nevajadzētu būt aizkustinošs.
Tas ir arī taisnība -
32 bitu sistēma, 32 biti nozīmē jums ir 32 bitu, lai noteiktu atmiņas adresi.
Tas ir iemesls, kāpēc norādes ir 8 baiti, jo 32 biti ir 8 baiti - vai 4 baiti.
Norādes ir 4 baiti.
Tātad, ja jūs redzat rādītāju, piemēram oxbfffff, tas ir -
Ietilpst kādā programmu jūs varat vienkārši būvēt jebkāda patvaļīga rādītāju,
jebkur no ox0 līdz vērsis 8 f's - ffffffff.
[Students] Vai tu teikt, viņi 4 baiti? >> Jā.
[Students] Tad katrs baits būs - >> [Bowden] Heksadecimāla.
Heksadecimālajā - 5, 6, 7, 8. Tātad norādes jūs gatavojas vienmēr redzēt heksadecimālo.
Tas ir tikai, kā mēs klasificēt norādes.
Ik pēc 2 cipari heksadecimālā ir 1 baits.
Tātad būs 8 heksadecimālcipariem par 4 baiti.
Tāpēc katru rādītāju uz 32-bitu sistēmas būs 4 baiti,
kas nozīmē, ka jūsu process var būvēt no patvaļīgu 4 baitus
un veikt rādītāju no tā,
kas nozīmē, ka, ciktāl tas ir zināms, tas var risināt visu no 2 līdz 32 baiti atmiņas.
Pat ja tas nav īsti ir pieeja, ka,
pat ja jūsu dators ir tikai 512 megabaiti, tas domā, ka ir tik daudz atmiņu.
Un operētājsistēma ir pietiekami gudrs, ka tas būs tikai piešķirs kas jums tiešām ir nepieciešams.
Tas nav tikai iet, ak, jaunu procesu: 4 gigs.
>> Yeah. >> [Students] Ko vērsis nozīmē? Kāpēc jūs rakstīt?
Tas ir tikai simbols heksadecimālo.
Kad jūs redzat kādu cipara sākt ar vērsis, secīgie lietas ir heksadecimālais.
[Students] Jūs izskaidrotu par to, kas notiek, kad programma beidzas. >> Jā.
Kas notiek, kad programma beidzas ir operētājsistēma
tikai izdzēš kartējumus, ka tas ir par šīm adresēm, un tas arī viss.
Operētājsistēma tagad var vienkārši dot šo atmiņu uz citu programmu izmantot.
[Students] Labi.
Tātad, ja jūs piešķirt kaut uz kaudzes vai skursteņa vai globālo mainīgo vai kaut,
viņi visi vienkārši pazūd, tiklīdz programma beidzas
jo operētājsistēma ir tagad brīvi dot šo atmiņu uz kādu citu procesu.
[Students] Pat ja ir iespējams, vēl vērtības rakstīts? >> Jā.
Šīs vērtības ir iespējams joprojām.
Tas ir tikai tas būs grūti nokļūt pie viņiem.
Tas ir daudz grūtāk saņemt pie viņiem, nekā tas ir, lai saņemtu pie svītrots failu
jo svītrots failu veida sēž tur uz ilgu laiku, un cietais disks ir daudz lielāks.
Tātad tas notiek, lai pārrakstītu dažādas daļas atmiņas
pirms tas notiek, lai pārrakstītu rieciens atmiņas ka fails, ko izmanto, lai būt.
Bet galvenais atmiņas, RAM, jūs ciklu caur daudz ātrāk,
tāpēc tas būs ļoti ātri tikt pāri.
Jautājumi par šo vai kaut kas cits?
[Students] man ir jautājumi par citu tēmu. >> Labi.
Vai kāds ir jautājumi par šo?
>> Labi. Atšķirīgs temats. >> [Students] Labi.
Man bija iet caur kādu no praksē testus,
un vienā no tām tika runā par sizeof
un vērtība, kas tiek atgriezta vai dažādi mainīgi veida. >> Jā.
Un tas teica, ka gan int un ilgi gan atgriešanos 4, lai viņi abi 4 baiti garš.
Vai ir kāda atšķirība starp int un ilgu atšķirība, vai tas ir tas pats?
Jā, tur ir atšķirība.
C standarta -
Es droši vien esmu gatavojas izjaukt.
The C standarta ir tāpat kā to, ko C ir, tad oficiālo dokumentāciju C.
Tas ir tas, ko tā saka.
Tātad C standarta vienkārši saka, ka char būs mūžīgi un vienmēr būs 1 baits.
Viss pēc tam - īsi vienmēr ir tikai noteikts kā lielāka vai vienāda ar char.
Tas varētu būt stingri lielāks nekā, bet ne pozitīvi.
Int tāpat definē kā lielāka vai vienāda ar īsu.
Un ilgi ir tikai noteikts kā lielāka vai vienāda ar int.
Un ilgi ilgi ir lielāks vai vienāds ar ilgi.
Tātad vienīgā lieta C standarts nosaka ir relatīvs sakārtošana viss.
Faktiskais atmiņas apjoms, kas lietas aizņem parasti ir līdz īstenošanai,
bet tas ir diezgan labi definēta šajā brīdī. >> [Students] Labi.
Tātad šorti ir gandrīz vienmēr būs 2 baiti.
Ints ir gandrīz vienmēr būs 4 baiti.
Long garie gandrīz vienmēr būs 8 baiti.
Un ilgojas, tas atkarīgs no tā, vai jūs izmantojat 32 bitu vai 64 bitu sistēmu.
Tik ilgi gatavojas atbilst tipa sistēmu.
Ja jūs izmantojat 32 bitu sistēma, piemēram, iekārtu, tā būs 4 baiti.
Ja jūs izmantojat 64 bitu, piemēram, daudz nesen datoru, tas būs 8 baiti.
>> Ints gandrīz vienmēr ir 4 baiti šajā brīdī.
Long garie gandrīz vienmēr ir 8 baiti.
Agrāk, Ints izmanto, lai tikai 2 baiti.
Bet paziņo, ka tas pilnībā atbilst visiem šiem lielāks un vienāds ar attiecībām.
Tik ilgi ir pilnīgi atļauts būt tikpat lieli kā veselums,
un tas ir arī atļauts būt tikpat lieli kā ilgi ilgi.
Un tas tikai tā notiek, lai būt, ka 99,999% no sistēmas, tas būs vienāds ar
nu int vai ilgi ilgi. Tas tikai atkarīgs 32-bitu vai 64 bitu. >> [Students] Labi.
Jo pludiņiem, cik ir komata izraudzītā ziņā bitiem?
Tāpat kā bināro? >> Jā.
Jums nav nepieciešams zināt, ka par CS50.
Jums pat nav uzzināt, ka 61.
Jums nav uzzināt, ka īsti jebkurā laikā.
Tas ir tikai pārstāvību.
Es aizmirst precīzu bitu piešķīrumus.
Peldošas punkta ideja ir, ka jūs piešķirt konkrētu skaitu bitu pārstāvēt -
Būtībā, viss ir zinātniskajā pierakstā.
Tātad jūs piešķirt konkrētu skaitu bitu pārstāvēt numuru pats, kā 1,2345.
Es nekad nevar pārstāvēt vairākus ar vairāk cipariem nekā 5.
Tad jūs arī piešķir īpašu bitu skaits, lai tas mēdz būt, piemēram,
Jūs varat tikai līdz noteiktam skaitam, piemēram, ka ir lielākais rādītājs var būt,
un jūs varat tikai iet uz leju, lai noteiktu eksponents,
patīk, ka ir mazākā eksponents var būt.
>> Es neatceros precīzu veidu biti tiek piešķirti visi no šīm vērtībām,
bet noteiktu skaitu bitu ir veltīta 1,2345,
cits zināms skaits bitu tiek veltīta eksponents,
un tas ir iespējams tikai, lai pārstāvētu eksponents noteiktu lielumu.
[Students] Un dubultā? Ir tā, ka, piemēram, papildus rīvdēli? >> Jā.
Tas ir tas pats, kas peldēt izņemot tagad jūs izmantojat 8 baiti, nevis 4 baiti.
Tagad jūs varēsiet izmantot 9 cipariem vai 10 cipariem,
un šī būs iespēja doties līdz 300 nevis 100. >> [Students] Labi.
Un pludiņi ir arī 4 baiti. >> Jā.
Nu, atkal, tas, iespējams, ir atkarīgs kopumā par vispārējo īstenošanu,
bet pludiņi ir 4 baiti, divvietīgi ir 8.
Dubultspēlē sauc dubultā, jo tie ir dubultā lieluma pludiņi.
[Students] Labi. Un vai ir dubultā dubultspēlē? >> Tur nav.
Es domāju - >> [students] Tāpat garām garie? >> Jā. Es tā nedomāju. Jā.
[Students] pagājušā gada tests bija par galveno funkciju jautājums
kam jābūt daļa no jūsu programmas.
Atbilde bija, ka tas nav jābūt daļa no jūsu programmas.
Kādā situācijā? Tas, ko es redzēju.
[Bowden] Šķiet - >> [students] Kas situācija?
Vai jums ir problēma? >> [Students] Jā, es varu noteikti vilkt to uz augšu.
Tai nav jābūt, tehniski, bet būtībā tas būs.
[Students] Es redzēju vienu par atšķirīgu gadu.
Tas bija kā True vai False: derīgs - >> Ak, c fails.?
. [Students] Jebkura c fails jābūt - [abi runājot uzreiz - nesaprotams]
Labi. Tā ka ir atsevišķi.
>> . C failu tikai jāietver funkcijas.
Jūs varat izveidot failu mašīnu kodu, binārā, neatkarīgi,
ar to nav izpildāms vēl.
Derīgs izpildāmā jābūt galveno funkciju.
Jūs varat rakstīt 100 funkcijas 1 failu, bet nav galvenie
un tad sastādīt ka ​​līdz bināro,
tad jums rakstīt citu failu, kas ir tikai galvenais, bet tas prasa ķekars no šīm funkcijām
Šajā binārā failā nekā šeit.
Un tad, kad jūs gūstat izpildāmā, ka tas, ko Linker dara
ir tā apvieno šos 2 bināros failus izpildāmā.
Tā. C fails nav nepieciešams, lai būtu galvenā funkcija vispār.
Un uz lieliem koda bāzes jūs redzēsiet tūkstošiem. C failus un 1 galveno failu.
Vēl jautājumi?
[Students] Tur bija cits jautājums.
Tā teica darīt ir kompilators. Patiess vai aplams?
Un atbilde ir nepatiesa, un es saprotu, kāpēc tas nav kā šķindēt.
Bet ko mēs saucam darīt, ja tā nav?
Padarīt ir būtībā tikai - es redzu tieši to, ko prasa to.
Bet tas tikai sākas komandas.
Padarīt.
Es varu pull šo augšu. Yeah.
Ak, jā. Veikt arī tas, ka.
Šis saka marku lietderība mērķis ir noteikt automātiski
daļām, kas lielā programmai jābūt recompiled
un izdot komandas recompile tos.
Jūs varat padarīt padarīt failus, kas ir absolūti milzīgs.
Padarīt izskatās pēc laika zīmogu failu un, tāpat kā mēs teicām iepriekš,
Jūs varat sastādīt atsevišķus failus leju, un tas nav līdz jums Linker
ka viņi kopā izpildāmā.
Tātad, ja jums ir 10 dažādas lietas, un jūs veikt izmaiņas no tiem 1,
tad ko darīt gatavojas darīt, ir tikai recompile ka 1 fails
un tad Relink viss kopā.
Bet tas ir daudz stulbāki nekā.
Tas ir atkarīgs no jums, lai pilnīgi noteikt, ka tas, ko tai būtu veicams.
Tā pēc noklusējuma ir spēja atpazīt šo laika zīmogu sīkumi,
bet jūs varat uzrakstīt Make fails darīt jebko.
Jūs varat rakstīt padarīt failu tā, ka tad, kad jūs tipa padarīt to tikai CD uz citu direktoriju.
Es biju kļūst neapmierinātas, jo es lavierēt viss iekšā manu Appliance
un tad es apskatīt PDF no Mac.
>> Tad es eju uz Finder un es varu iet, Connect to Server,
un serveris es pieslēgties ir mana tehnika, un tad es atvērt PDF
kas izpaužas apkopo LaTeX.
Bet man bija kļūst neapmierināti, jo katru reizi, kad es nepieciešams, lai atsvaidzinātu PDF,
Man bija kopēt to uz konkrētu direktoriju, ka tā varētu piekļūt
un tas kļūst kaitinoši.
Tā vietā es uzrakstīju Make fails, kurā jums ir noteikt, kā tas padara lietas.
Kā jūs veicat šajā ir PDF LaTeX.
Tāpat kā jebkuru citu marku failu - vai es domāju, jums nav redzējis lai failus,
bet mums ir Ierīces globālu Make fails, kas vienkārši saka,
ja jums ir sastādīšanas C failu, izmantojiet šķindēt.
Un tāpēc šeit manā Make fails, ka es saku,
Šis fails jūs gatavojas vēlaties, lai apkopotu ar PDF LaTeX.
Un tāpēc tas ir PDF LaTeX ka dara sagatavošanu.
Padarīt netiek apkopošanai. Tas ir tikai rādīt šīs komandas secībā es norādīto.
Lai tas iet PDF latekss, tas kopē to direktoriju es gribu, lai to kopēt,
tā CD uz direktoriju un dara citas lietas,
bet visiem tas ir jāatzīst, kad failu izmaiņas,
un ja tā maina, tad tas darbosies komandas, kas tas ir paredzēts, lai palaistu
Kad fails mainās. >> [Students] Labi.
Es nezinu, kur globālās marku faili ir man, lai pārbaudītu out.
Citi jautājumi? Kaut kas no pagātnes viktorīnas? Any rādītājs lietas?
Ir smalkas lietas ar šautru, piemēram -
Es neesmu gatavojas, lai varētu atrast viktorīna jautājumu par to -
bet tāpat kā šāda veida lieta.
Pārliecinieties, ka jūs saprotat, ka tad, kad es saku int * x * y -
Tas nav īsti kaut kas šeit, es domāju.
Bet, tāpat kā * x * y, kas ir 2 mainīgie, kas ir par kaudze.
Kad es saku x = malloc (sizeof (int)), x ir joprojām mainīga uz skursteņa,
malloc ir daži bloks pār kaudzes, un mēs esam, kam x norāda uz kaudzes.
>> Lai kaut uz skursteņa punktiem līdz kaudzes.
Ikreiz, kad jūs malloc kaut ko, jūs neizbēgami uzglabājot to iekšpusē rādītājs.
Lai rādītājs ir uz skursteņa, tad malloced bloks ir uz kaudzes.
Daudzi cilvēki saņemt sajaukt un pateikt int * x = malloc, x ir uz kaudzes.
Nē Kas x norāda uz ir uz kaudzes.
x pati uz skursteņa, ja vien kāda iemesla dēļ jums ir x būt globālo mainīgo,
tādā gadījumā tas notiek, ir citā reģionā atmiņu.
Tātad sekotu, šie kaste un bultu diagrammas ir diezgan izplatīta, lai viktorīnas.
Vai, ja tas nav 0 viktorīnu, tas būs uz 1 viktorīnā.
Jums vajadzētu zināt visas šīs, pasākumus apkopojot
jo jums bija jāatbild uz jautājumiem par tiem. Jā.
[Students] Vai mēs iesim pa šiem soļiem - >> Protams.
Pirms posmiem un apkopojot mums ir preprocessing,
apkopojot, montāža, un savieno.
Preprocessing. Ko tas dara?
Tas ir vieglākais solis - labi, nepatīk -
tas nenozīmē, ka tas būtu skaidrs, bet tas ir vieglākais solis.
Jūs puiši varētu īstenot to paši. Yeah.
[Students] Ņem to, kas jums ir jūsu ietver, piemēram, šo un to kopijas, un tad arī nosaka.
Tas izskatās lietām, piemēram # ietvert un # define,
un tas tikai kopijas un pastas, ko tie patiesībā nozīmē.
Tātad, kad jūs sakāt # ietvert cs50.h, apstrādātāju ir kopēšanas un ielīmēšanas cs50.h
uz šīs līnijas.
Kad jūs sakāt # define x būt 4, apstrādātāju iet cauri visai programmai
un aizvieto visus gadījumus x ar 4.
Tāpēc apstrādātāju ņem derīgu C failu un izvada derīgu C failu
ja lietas ir nokopēt un ielīmēt.
Tāpēc tagad apkopojot. Ko tas dara?
[Students] Pats no C uz bināro.
>> [Bowden] Tas nav iet visu ceļu uz bināro.
[Students] Lai mašīnu kodu tad? >> Tas nav mašīnu kodu.
[Students] Asambleja? >> Asambleja.
Tā iet uz Asamblejai pirms tā iet visu ceļu uz C kodu,
un dzimtās valodas darīt kaut kas līdzīgs šim.
Izvēlēties jebkuru augsta līmeņa valoda, un, ja jūs gatavojas apkopot to,
tas ir iespējams apkopot pa soļiem.
Pirmkārt, tas notiek, lai apkopotu Python uz C, tad tas notiek, lai apkopotu C līdz asambleja,
un tad asambleja gatavojas saņemt jātulko uz bināro.
Tātad apkopojot gatavojas celt to no C līdz asamblejai.
Vārds sastādīšanas parasti nozīmē apvienojot to no augstākā līmenī
uz zemāka līmeņa programmēšanas valodu.
Tātad šis ir vienīgais solis apkopošanai, ja jūs sākat ar augsta līmeņa valoda
un galu galā ar zema līmeņa valoda, un tas ir iemesls, kāpēc solis sauc apkopošanai.
[Students] Laikā apkopojot, pieņemsim, ka jūs esat darījuši # ietvert cs50.h.
Vai kompilators recompile cs50.h, tāpat funkcijām, kas ir tur,
un pārveido to montāža kodu, kā arī,
vai arī tas kopēt un ielīmēt kaut kas ir bijis iepriekš asambleja?
cs50.h būs diezgan daudz nekad nonāk asamblejā.
Sīkumi, piemēram, funkciju prototipus un lietas ir tikai, lai jūs varētu būt uzmanīgiem.
Tas garantē, ka kompilators var pārbaudīt lietas, piemēram, jūs zvanāt funkcijas
ar tiesībām atgriešanās veidu un tiesības argumentiem un stuff.
>> Tāpēc cs50.h tiks preprocessed failā, un tad, kad tas ir apkopojot
tas būtībā izmest pēc tam nodrošina, ka viss tiek saukta pareizi.
Bet funkcijas definētie CS50 bibliotēkā, kas ir atsevišķi no cs50.h,
tie netiks atsevišķi apkopoti.
Tas patiešām nāk uz leju savieno solis, lai mēs nokļūt, ka otrais.
Bet vispirms, kas ir montāžas?
[Students] Asambleja uz bināro? >> Jā.
Montāža.
Mums nav to saucam apkopojot jo Asambleja ir diezgan daudz tīra tulkojumu bināro.
Ir ļoti maz loģika iet no Asamblejas bināro.
Tas ir tāpat kā skatoties uz augšu tabulā, ak, mums ir šī instrukcija;
kas atbilst 01.110 bināro.
Un tā faili, kas montāžas parasti rezultāti ir. O failus.
Un. O faili ir tas, ko mēs teicām iepriekš,
Kā fails nav nepieciešams, lai būtu galvenā funkcija.
Jebkuru failu var apkopot leju, lai. O failu, kamēr tas ir derīgs C fails.
To var sastādīt līdz. O.
Tagad, saistot ir kādi patiesībā nes ķekars o failus un. Nes tos uz izpildāmā.
Un tā, kādi saistot tas ir varat domāt par CS50 bibliotēkas kā. O failu.
Tā ir jau apkopoti bināro failu.
Un tad, kad jūs sastādīt savu failu, jūsu hello.c, kurā aicina GetString,
hello.c izpaužas apkopoti līdz hello.o,
hello.o tagad ir bināro.
Tas izmanto GetString, tāpēc ir jāiet pār cs50.o,
un Linker smooshes tos kopā un kopē GetString šajā failā
un nāk ar izpildāmā, kas ir visas funkcijas tai vajadzīga.
Tāpēc cs50.o nav reāli O fails, bet tas ir pietiekami tuvu, ka nav būtiskas atšķirības.
Tik saistot tikai rada ķekars failus kopā
ka atsevišķi satur visas funkcijas, man ir nepieciešams, lai izmantotu
un rada izpildāmā, kas faktiski darbojas.
>> Un tā tas ir arī tas, ko mēs teicām pirms
kur var būt 1000. c failus, jūs sastādīt tos visus o failus.
kas, iespējams pieņemt, bet, tad jums mainīt 1. c failu.
Jums tikai nepieciešams recompile ka 1. C failu un tad Relink viss pārējais,
saite visu atpakaļ kopā.
[Students] Kad mēs saistot mēs rakstām lcs50?
Jā, tā lcs50. Ka karoga signālus ar linker ka jums jābūt saista šajā bibliotēkā.
Jautājumi?
Vai mēs esam aizgājuši pa binārā citā kā 5 sekundēm pirmajā lekcijā?
Es tā nedomāju.
Jums vajadzētu zināt visu par lielo Os ka mēs esam aizgājuši pārāk,
un jums vajadzētu būt iespējai, ja mēs tev funkciju,
Jums vajadzētu būt iespējai pateikt, tas ir liels O, rupji. Vai arī, liels O ir raupja.
Tātad, ja jūs redzat ligzdot uz cilpas looping pa to pašu skaitu lietas,
piemēram int i, i <n, int j, j > [students] n rūtiņām. >> Tas mēdz būt n rūtiņām.
Ja jums ir trīskāršs ligzdot, tā mēdz būt n kubā.
Tāpēc, ka veida lieta, jums vajadzētu būt iespējai norādīt uzreiz.
Jums jāzina ievietošanas šķirot un burbulis šķirot un apvienot veida un visu no tiem.
Tas ir vieglāk saprast, kāpēc viņi ir tie n rūtiņām un n log n un visiem, kas
jo es domāju, ka tur bija viktorīnu vienu gadu, kur mēs būtībā deva jums
gada burbuļu veida ieviešana un sacīja: "Kāds ir darba laiks šīs funkcijas?"
Tātad, ja jūs atzīt to kā burbulis kārtot, tad jūs varat uzreiz pateikt n rūtiņām.
Bet, ja jūs vienkārši skatīties uz to, jums nav pat nepieciešams saprast, tas ir burbulis šķirot;
Jūs varat vienkārši pateikt tas dara šo un to. Šis ir n rūtiņām.
[Students] Vai ir kādas grūtas piemērus var nākt klajā ar,
piemēram līdzīgu ideju norādītas?
>> Es nedomāju, ka mēs varētu sniegt jums jebkādu grūts piemērus.
Burbulis šķirot lieta ir apmēram tikpat grūts kā mēs varētu iet,
un pat, ka, kamēr jūs saprotat, ka jūs atkārtojot pa masīva
katram elementam masīvā, kas būs kaut kas ir n rūtiņām.
Ir vispārīgi jautājumi, piemēram, tepat mums ir - Ak.
Tikai otro dienu, Dags apgalvoja: "Es esmu izgudroja algoritmu, kas var sakārtot masīvu
"No n skaitļu O (log n) laiks!"
Tātad, kā mēs zinām, ka ir neiespējami?
[Dzirdams studentu reaģēšanas] >> Jā.
Vismaz, jums ir pieskarties katru elementu masīvā,
tāpēc nav iespējams sakārtot masīvu -
Ja viss ir nešķirotu kārtībā, tad jūs esat būs pieskaras viss masīvā,
tāpēc tas ir iespējams darīt to mazāk nekā O n.
[Students] Jūs mums parādīja, ka piemērs ir iespēja to darīt O n
ja jūs izmantojat daudz atmiņas. >> Jā.
Un That - es aizmirst to That - Vai tas skaitīšanas šķirot?
Hmm. Tas ir vesels šķirošanas algoritmu.
Es meklēju īpašo nosaukumu tas, ka es nevarēju atcerēties pagājušajā nedēļā.
Yeah. Tie ir veidi veidu, kas var paveikt lietas n Big O.
Bet ir ierobežojumi, piemēram, jūs varat izmantot tikai integers līdz noteiktam skaitam.
Plus, ja jūs mēģināt kārtot kaut That -
Ja jūsu masīvs ir 012, -12, 151, 4 miljoni,
tad viens elements ir gatavojas pilnībā sagraut visu šķirošanu.
>> Jautājumi?
[Students] Ja jums ir rekursīvo funkciju un tas tikai padara rekursīvas zvanu
ietvaros atgriešanās paziņojumu, ka ir astes rekursīvs
un tā būtu, ka ne vairāk atmiņas laikā Runtime
vai tas būtu vismaz izmantot salīdzināmu atmiņā kā iteratīvs risinājums?
[Bowden] Jā.
Tas būtu iespējams, būs nedaudz lēnāks, bet nav īsti.
Astes rekursīvs ir diezgan laba.
Raugoties atkal kaudze rāmji, pieņemsim, ka mums ir galvenais
un mums ir int bar (int x) vai kaut ko.
Tas nav ideāls rekursīvas funkcijas, bet atgriešanās bārs (x - 1).
Tātad acīmredzot, tas ir kļūdains. Jums ir nepieciešams bāzes lietas un stuff.
Bet doma ir, ka tas ir aste rekursīvs
kas nozīmē, kad galvenais zvani bārs tas notiek, lai saņemtu savu steka rāmi.
Šajā kaudze rāmi tur būs maz bloks atmiņas
kas atbilst tās argumentu x.
Un tāpēc pieņemsim, ka galvenais notiek zvanīt bar (100);
Tātad x ir gatavojas sākt no kā 100.
Ja kompilators atzīst, ka šis ir astes rekursīvs funkcija,
tad kad josla padara tās rekursīvas aicinājumu uz bāru,
vietā, lai jauno kaudze rāmi, kas ir, ja kaudze sāk aug lielākoties,
galu galā tā nonāks kaudzes un tad jūs saņemsiet segmentācijas kļūdas
jo atmiņas sākas sadursmes.
>> Tā vietā, lai padarītu savu steku rāmi, tā var realizēt,
hey, es nekad tiešām ir nepieciešams atgriezties pie šā kaudze rāmi,
tā vietā es ņemšu tikai aizstāt šo argumentu ar 99 un pēc tam sākt bārs visā.
Un tad tas būs jādara vēlreiz, un tas sasniegs atgriešanās bārs (x - 1),
un tā vietā, lai jauno kaudze rāmi, tas būs vienkārši nomainīt savu pašreizējo argumentu ar 98
un tad lēkt atpakaļ uz paša sākuma bārā.
Šīs operācijas, aizstājot ka 1 vērtību kaudze un lekt atpakaļ uz sākumu,
ir diezgan efektīvi.
Tātad ne tikai šis pats atmiņas izmantošana kā atsevišķu funkciju, kas ir atkārtots
jo jūs tikai izmantojot 1 steka rāmis, bet jūs neesat cieš downsides
, kam zvanīt funkcijas.
Zvanu funkcijas var būt nedaudz dārgāka, jo tas ir jādara visu šo setup
un Teardown un tas viss.
Tātad šī aste rekursija ir labs.
[Students] Kāpēc tas neradītu jaunus soļus?
Jo tas saprot, ka tas nav nepieciešams.
Zvanu uz bāru ir tikai atgriežas rekursīvas zvanu.
Tāpēc nav nepieciešams neko darīt ar atgriešanās vērtību.
Tas ir tikai gatavojas nekavējoties atdot.
Tātad tas ir tikai gatavojas nomainīt savu argumentāciju un sākt no jauna.
Un arī, ja jums nav asti rekursīvas versiju,
tad jums visas šīs bāri, kur, kad šis bārs atgriež
tas ir, lai atgrieztos tās vērtību šo vienu, tad bārs uzreiz atgriež
un tas atgriežas savu vērtību uz šo vienu, tad tas ir tikai gatavojas nekavējoties atgriezties
un atgriezties tās vērtību uz šo vienu.
Tātad jūs esat taupīšanu šis popping visas šīs lietas nost no skursteņa
kopš atgriešanās vērtība ir tikai būs pagājis visu ceļu atpakaļ līdz vienalga.
Tad kāpēc ne tikai nomainīt mūsu argumentu ar atjaunināto argumentu un sākt no jauna?
Ja funkcija nav astes rekursīvs, ja jūs kaut kas līdzīgs -
[Students], ja josla (x + 1). >> Jā.
>> Tātad, ja jūs nodot to stāvoklī, tad jūs darāt kaut ko ar atgriešanās vērtību.
Vai pat, ja jūs vienkārši darīt atdevi 2 * bar (x - 1).
Tāpēc tagad josla (x - 1) nepieciešams atgriezties, lai tā varētu aprēķināt 2 reizes, ka vērtība,
tāpēc tagad tai ir nepieciešama sava atsevišķa steka rāmi,
un tagad, nav svarīgi, cik grūti jums izmēģināt, jūs dodas uz nepieciešamību -
Tas nav astes rekursīvs.
[Students] Vai es mēģinātu celt rekursija tiekties uz astes rekursijas -
[Bowden] Ir ideāla pasaule, bet CS50 jums nav.
Lai iegūtu asti rekursijas, vispār, jums izveidot papildu argumentu
kur josla būs int x vērā y
un y atbilst gala lieta, ko vēlaties atgriezties.
Tātad, tad tas jūs esat būs atgriešanās bar (x - 1), 2 * y.
Tātad tas ir tikai augsta līmeņa, kā jūs pārveidot lietas, kas asti rekursīvas.
Bet papildu arguments -
Un tad beigās, kad jūs sasniedzat savu pamata situāciju, jūs vienkārši atgriezties y
jo jūs esat uzkrājas visu laiku atgriešanās vērtību, ko vēlaties.
Jūs veida ir darot to iteratīvi bet izmantojot rekursīvas zvaniem.
Jautājumi?
[Students] Varbūt par rādītāja aritmētisko, piemēram, izmantojot virknes. >> Protams.
Rādītājs aritmētika.
Ja izmanto virknes tas ir viegli, jo stīgas ir char zvaigznes,
simboli ir mūžīgi un vienmēr baitu,
un tā rādītājs aritmētiskais ir līdzvērtīgs regulāri aritmētisko kad jūs nodarbojas ar stīgām.
Pieņemsim tikai teikt, char * s = "sveiki".
Tātad mums ir bloku atmiņā.
Tas nepieciešams 6 baiti, jo jums vienmēr vajag null terminatoru.
Un char * s gatavojas norādīt uz sākumu šī masīva.
Tāpēc s norāda tur.
Tagad tas ir būtībā kā jebkurš masīvs darbi,
neatkarīgi no tā, vai tā bija atgriešanās pēc malloc vai tas ir uz skursteņa.
Jebkurš masīvs būtībā rādītājs uz sākuma masīvs,
un tad jebkura masīva operācija, jebkura indeksācija, ir tikai iet uz šo masīvs noteiktu atlīdzību.
>> Tātad, kad es saku kaut ko līdzīgu s [3], tas ir gatavojas s un skaitīšana 3 chars collas
Tāpēc s [3], mums ir 0, 1, 2, 3, tāpēc s [3] gatavojas atsaukties uz šo l.
[Students] Un mēs varētu sasniegt to pašu vērtību darot s + 3 un tad iekavas zvaigzne?
Jā.
Tas ir līdzvērtīgs * (s + 3);
un tas ir uz visiem laikiem un vienmēr līdzvērtīgi nav svarīgi, ko jūs darāt.
Jums nekad nevajadzēs izmantot balsteņa sintaksi.
Jūs vienmēr varat izmantot * (S + 3) sintakse.
Cilvēki mēdz patīk balsteņa sintaksi, lai gan.
[Students] Tātad visi bloki ir faktiski tikai norādes.
Ir neliela atšķirība, kad es saku int x [4]; >> [students] Vai tas rada atmiņu?
[Bowden] Tas būs izveidot 4 Ints uz skursteņa, tā 16 baiti kopumā.
Tas notiek, lai radītu 16 baiti uz skursteņa.
x netiek saglabāta jebkur.
Tas ir tikai simbols, kas attiecas uz sākuma lieta.
Jo jums paziņoja masīvs iekšpuses šo funkciju,
ko kompilators gatavojas darīt, ir vienkārši nomainīt visus gadījumus mainīgā x
ar kur tas noticis, lai izvēlētos, lai šos 16 baiti.
To nevar darīt, ka ar char * s, jo s ir faktiskā rādītājs.
Tā ir bezmaksas, tad norādīt uz citām lietām.
x ir konstants. Jūs nevar būt tā norāda uz citu masīvu. >> [Students] Labi.
Bet šī ideja, šis indeksācija, ir tas pats, neatkarīgi no tā, vai tas ir tradicionāls masīvs
vai, ja tas ir rādītājs, lai kaut vai, ja tas rādītājs, lai malloced masīvs.
Un patiesībā, tas ir tik līdzvērtīga ka ir arī pats.
Tas faktiski tikai nozīmē to, kas iekšpusē no iekavās un to, kas palicis pāri no iekavās,
piebilst tos kopā, un dereferences.
Tātad tas ir tikpat derīga kā * (S + 3) vai s [3].
[Students] Vai jums ir norādes, kas norāda uz 2-dimensiju masīvu?
>> Tas ir grūtāk. Tradicionāli, nē.
2 dimensiju masīvs ir tikai 1-dimensiju masīvs ar kādu ērtu sintaksi
jo, kad es saku int x [3] [3], tas ir tiešām tikai 1 masīvs ar 9 vērtībām.
Un tad, kad es indekss, kompilators zina, ko es domāju.
Ja es saku x [1] [2], tas zina, ka es gribu iet uz otrās rindas, tāpēc tas būs izlaist pirmo 3,
un tad tas grib otro lieta, ka, lai tas notiek, lai iegūtu šo vienu.
Bet tas joprojām ir tikai viena dimensiju masīvs.
Un tāpēc, ja es gribēju, lai piešķirtu rādītāju uz šo masīvs,
Es teiktu int * p = x;
X veids ir vienkārši -
Tas ir aptuvens sakot veida X, jo tas ir tikai simbols un tas nav faktiskā mainīgs,
bet tas ir tikai int *.
x ir tikai rādītājs uz sākuma šo. >> [Students] Labi.
Un tāpēc es nevarēs piekļūt [1] [2].
Es domāju, ka ir īpaša sintakse pasludināšanai par rādītāju,
kaut smieklīgi kā int (* p [-. kaut pilnīgi smieklīgi es pat nezinu.
Bet ir, lai deklarētu norādes, piemēram, ar iekavām un lietām sintakse.
To var pat ļauj jums darīt.
Es varētu atskatīties kaut kas varētu man pateikt patiesību.
Es meklēt to vēlāk, ja ir stacionārajiem sintakse. Bet jūs nekad redzēt.
Un pat sintakse ir tik arhaiska, ka, ja jūs to izmantot, cilvēki tiks neizprotamu.
Daudzdimensiju masīvi ir diezgan reti, jo tas ir.
Jūs diezgan daudz -
Nu, ja jūs darāt matrix lietas tas nav būs reti,
bet C jūs reti būs izmantojot daudzdimensiju masīvus.
Yeah. >> [Students] Pieņemsim, ka jums ir patiešām ilgi masīvs.
>> Tātad virtuālo atmiņu tas varētu būt viss pēc kārtas,
tāpat elementiem blakus viens otram,
bet fiziskā atmiņa, tas būtu iespējams, ka tiks sadalīt? >> Jā.
Kā virtuālā atmiņas darbus tā ir tikai atdalās -
To piešķiršanu vienība ir lapas, kas mēdz būt 4 kilobaiti,
un tad, kad process saka, hey, es vēlos izmantot šo atmiņu,
operētājsistēma gatavojas atvēlēt to 4 kilobaitus, ka maz bloka atmiņu.
Pat ja jūs tikai izmantot vienu nedaudz baitu visā blokā atmiņu,
operētājsistēma ir gatavojas sniegt tai pilnu 4 kilobaitus.
Tātad, ko tas nozīmē, es varētu būt - teiksim tā ir mana kaudze.
Šo kaudze varētu atdalīt. Mana kaudze varētu būt megabaitu un megabaiti.
Mana kaudze varētu būt milzīgs.
Bet kaudze pati ir sadalīt atsevišķās lapās,
kas, ja mēs skatāmies uz vairāk nekā šeit, teiksim tā ir mūsu atmiņa,
ja man ir 2 gigabaiti RAM, tas ir faktiskā adrese 0 piemēram 0. baits no mana RAM,
un tas ir 2 gigabaiti visu ceļu uz leju šeit.
Tātad šī lapa var atbilst šā bloka nekā šeit.
Šī lapa varētu atbilst šā bloka nekā šeit.
Tas varētu atbilst šo vienu pār šeit.
Tāpēc operētājsistēma ir brīvi piešķirt fiziskās atmiņas
uz jebkuru individuālu lapā patvaļīgi.
Un tas nozīmē, ka, ja šī robeža notiek statņu masīvs,
masīvs notiek atstāt šo un pa labi no šā rīkojuma lapā,
tad masīvs būs sadalīt fiziskās atmiņas.
Un tad, kad jūs atmest programmu, kad process beidzas,
šie samērošanai saņemt izdzēsta, un tad tas ir brīvi izmantot šos maz blokiem citām lietām.
Vēl jautājumi?
[Students] rādītājs aritmētika. >> Ak jā.
Stīgas bija vieglāk, bet meklē kaut ko līdzīgu Ints,
Tātad atpakaļ pie int x [4];
Vai tas ir masīvs vai tas rādītājs, lai malloced masīvs 4 integers,
tas būs jāārstē tāpat.
[Students] Tātad bloki ir par kaudzes?
[Bowden] Masīvi ir nevis uz kaudzes. >> [Students] Ak.
>> [Bowden] Šis masīvs veida mēdz būt uz skursteņa
ja vien jūs deklarēta to - ignorējot pasaules mainīgie. Neizmantojiet pasaules mainīgie.
Iekšpusē funkciju es saku int x [4];
Tas notiek, lai izveidotu 4 veselo bloku uz skursteņa šim masīvs.
Bet tas malloc (4 * sizeof (int)); gatavojas doties uz kaudzes.
Bet pēc šī brīža es varu izmantot X un P diezgan daudz to pašu veidos,
izņemot izņēmumus es teicu par varat pārdalīt p.
Tehniski to izmēri ir nedaudz atšķirīgi, taču tas ir pilnīgi nekādas nozīmes.
Tu nekad faktiski izmantot to izmērus.
P Es varētu teikt lpp [3] = 2; vai x [3] = 2;
Jūs varat izmantot tos tādos pašos veidos.
Tāpēc rādītājs aritmētika tagad - Jā.
[Students] Vai jums nav jādara p * Ja jums ir iekavās?
Iekavas ir netiešs dereference. >> Labi.
Patiesībā, arī to, ko tu saki, ar var saņemt daudzdimensiju masīvus
ar norādes, ko jūs varat darīt, ir kaut kas līdzīgs, teiksim, int ** pp = malloc (sizeof (int *) * 5);
Es ņemšu tikai rakstīt to visu pirmās.
Es negribēju, ka viens.
Labi.
Ko es izdarīju šeit ir - Tas būtu pp [i].
Tātad pp ir rādītājs, lai rādītājs.
Tu esi mallocing procentpunkti norādīt uz masīvu 5 int zvaigznēm.
Tātad atmiņā jums ir uz skursteņa pp
Tas notiek, lai norādītu uz masīvu 5 blokiem, kas visas paši norādes.
Un tad, kad es malloc šeit lejā, es malloc, ka katrs no šiem atsevišķiem norādes
vajadzētu norādīt uz atsevišķu bloka 4 baiti uz kaudzes.
Tātad šis norāda uz 4 baiti.
Un tas viens norāda uz citu 4 baiti.
>> Un visi no tiem norāda uz saviem 4 baiti.
Tas dod man veids, kā to daudzdimensiju lietas.
Es varētu teikt, pp [3] [4], bet tagad tas nav tas pats, kā daudzdimensiju masīvus
jo daudzdimensiju masīvi tas tulkots [3] [4] par vienotu kompensēt uz x masīvs.
Tas dereferences p, piekļūst trešo indeksu, tad dereferences ka
un piekļūšanas - 4 nebūs spēkā - otrais rādītājs.
Tā kā, mums bija int x [3] [4] pirms kā daudzdimensiju masīvu
un kad jūs divreiz kronšteinu tas tiešām tikai viena dereference,
jūs pēc vienotu rādītāju un pēc tam kompensēt,
tas ir patiešām 2D atsauces.
Jūs sekot 2 atsevišķas norādes.
Tāpēc tas arī tehniski ļauj jums ir daudzdimensiju masīvus
kur katrs indivīds masīvs ir dažādi izmēri.
Tāpēc es domāju, robains daudzdimensiju masīvi ir tas, ko tas sauc
jo tiešām pirmā lieta varētu norādīt uz kaut ko, kas ir 10 elementi,
Otrā lieta varētu norādīt uz kaut ko, kas ir 100 elementi.
[Students] Vai ir kāds ierobežojums uz numuru norādes var būt
norādot uz citiem norādes? >> Nr
Jūs varat būt int ***** lpp.
Atpakaļ uz norādīto aritmētisko - >> [students] Ak. >> Jā.
[Students] Ja man ir int *** p un tad es to dereferencing un es saku p * ir vienāds ar šo lielumu,
tas ir tikai gatavojas darīt par 1 līmeni dereferencing? >> Jā.
Tātad, ja es gribu, lai piekļūtu lieta, ka pēdējā rādītājs ir pavērsts -
Tad jūs *** p. >> Labi.
Tātad šis ir p norāda 1 bloku, norāda uz vēl kādu bloku, norāda uz citu bloku.
Tad, ja jūs * p = kaut kas cits, tad jums ir mainīt šo
lai tagad norāda uz citu bloku. >> Labi.
>> [Bowden] un, ja šie malloced, tad tu tagad noplūdis atmiņu
Ja vien jums gadās būt dažādas atsauces šiem
jo jūs nevarat saņemt atpakaļ uz tiem tiem, kas jūs vienkārši aizmeta.
Rādītājs aritmētika.
int x [4], ir gatavojas piešķirt masīva 4 integers
kur x gatavojas norādīt uz sākumu masīva.
Tātad, kad es saku kaut ko līdzīgu X [1], es gribu to nozīmē iet uz otro skaitlim masīvā,
kas būtu tas viens.
Bet tiešām, tas ir 4 baiti uz masīva jo šis veselais aizņem 4 baitus.
Tāpēc kompensēt no 1 īsti nozīmē kompensēt no 1
reizes lielāka par neatkarīgi no masīva tips.
Tas ir masīvs integers, tāpēc zina darīt 1 reizi lielumu int kad tā vēlas kompensēt.
Citi sintakse. Atcerieties, ka tas ir līdzvērtīgs * (x + 1);
Kad es saku rādītāju + 1, kas, kas atgriež ir adrese, rādītājs ir uzglabātu
plus 1 reizes lielāka par veidu rādītāja.
Tātad, ja x = ox100, tad x + 1 = ox104.
Un jūs varat ļaunprātīgi šo un teikt kaut ko līdzīgu char * c = (char *) x;
un tagad c būs pati adrese kā x.
c būs vienāds ar ox100,
bet c + 1 būs vienāds ar ox101
jo rādītājs aritmētika atkarīgs no veida norādei, ka jūs papildinot.
Tātad c + 1, tas izskatās pēc C, tas ir char rādītājs, tāpēc tas notiek, lai pievienotu 1 reizes izmēru char,
kas vienmēr būs 1, lai jūs iegūtu 101,
tā kā, ja man x, kas ir arī vēl 100, x + 1 būs 104.
[Students] Vai jūs izmantot C + +, lai sekmētu savu rādītāju par 1?
Jā, jūs varat.
Jūs nevarat darīt, ka ar X, jo x ir tikai simbols, tā ir nemainīga, jūs nevarat mainīt x.
>> Bet c notiek vienkārši rādītājs, tāpēc C + + ir ļoti lietderīga, un tā pieauguma 1.
Ja c bija tikai int *, tad C + + būtu 104.
+ + Nav rādītājs aritmētika tāpat kā c + 1 būtu jādara rādītājs aritmētika.
Tas ir tiešām kā daudzas lietas, piemēram, sapludināšanas veida -
Tā vietā, lai izveidotu kopijas lietas, varat tā vietā iet -
Piemēram, ja es gribēju, lai iziet šo pusi no masīva - pieņemsim izdzēsīs daļu no tā.
Pieņemsim, ka es gribēju iet šaipus masīva uz funkciju.
Ko man iet uz šo funkciju?
Ja es iet x, es esmu iet šo adresi.
Bet es gribu, lai iet šo konkrēto adresi. Tātad, ko man iet?
[Students] Rādītājs + 2?
[Bowden] Tātad x + 2. Jā.
Tas būs šī adrese.
Jūs arī ļoti bieži redzēt to kā x [2], un tad adresi, kas.
Tātad jums ir nepieciešams veikt adresi to, jo grupa ir netiešs dereference.
x [2] attiecas uz vērtību, kas atrodas šajā zonā, un tad jūs vēlaties adresi šajā ailē,
lai jums teikt & X [2].
Tātad tas, kā kaut kas sapludināšanas veida kur vēlaties iet pusi sarakstu kaut
Jūs tiešām tikai iet & X [2], un tagad cik rekursīvas zvans ir bažas,
mana jaunā masīva sākas tur.
Pēdējā brīža jautājumus.
[Students] Ja mums nav likts aizvieto & zīmes vai - kas tas sauc? >> Kategorijā?
[Students] kategorijā. >> Tehniski, dereference operators, bet - >> [students] Dereference.
>> Ja mums nav izvirzīti zvaigzni vai zīme &, kas notiek, ja es tikai saku y = x un x ir rādītājs?
Kas ir y veidu? >> [Students] Es ņemšu tikai teikt, tas ir rādītājs 2.
Tātad, ja jūs vienkārši pateikt y = x, tagad x un y norāda uz to pašu. >> [Students] punkts uz to pašu.
Un, ja x ir int rādītājs? >> Tas varētu sūdzēties, jo jūs nevarat piešķirt norādes.
[Students] Labi.
Atcerieties, ka norādes, lai gan mēs izdarīt tos kā bultas,
tiešām visi tie veikals - int * x - tiešām viss x ir uzglabāt ir kaut kas līdzīgs ox100,
kas mums gadās pārstāvēt kā norādot uz bloku glabājas pie 100.
Tātad, kad es saku int * y = x, es esmu tikai kopēšanu ox100 uz y,
kas mēs esam tikai gatavojas pārstāvēt kā y, arī norādot uz ox100.
Un ja es saku int i = (int) x, tad es gatavojas glabāt neatkarīgi no ox100 vērtība ir
iekšpusē tā, bet tagad tas būs jāinterpretē kā veselums, nevis rādītājs.
Bet jums ir nepieciešams nodoto vai arī tas būs sūdzēties.
[Students] Tātad jūs domājat nodot -
Vai tas būs liešana int no x vai liešana int y?
[Bowden] Kas?
[Students] Labi. Pēc šiem iekavās ir tur būs x vai ay tur?
>> [Bowden] nu. x un y ir līdzvērtīgi. >> [Students] Labi.
Jo viņi abi norādes. >> Jā.
[Students] Tātad tas varētu glabāt heksadecimālo 100 skaitlim formā? >> [Bowden] Jā.
Bet ne vērtība neatkarīgi no tā norāda uz.
[Bowden] Jā. >> [Students] Tik vienkārši adrese skaitlim formā. Labi.
[Bowden] Ja jūs vēlētos, lai kādu savāda iemesla dēļ,
Jūs varētu tikai galā ar norādes un nekad galā ar veseliem skaitļiem
un vienkārši tāpat int * x = 0.
Tad jūs gatavojas iegūt patiešām sajaukt reizi rādītājs aritmētika sāk notiek.
Tāpēc skaitļi, ka viņi veikalā ir bezjēdzīgas.
Tas ir tikai kā jūs galu galā interpretējot tos.
Tāpēc es esmu brīvi kopēt ox100 no int * uz int,
un es esmu brīva, lai piešķirtu - jūs esat nokļuvis vērsīsies kliedza uz ne liešana -
Es esmu brīva, lai piešķirtu kaut ko līdzīgu (int *) ox1234 stāšanās šajā patvaļīgu int *.
Tik ox123 ir tikpat derīga atmiņas adrese kā & y.
& Y notiek atgriezties kaut kas ir diezgan daudz ox123.
[Students] Tas var būt patiešām foršs veids, kā aiziet no heksadecimālā uz decimālskaitli,
piemēram, ja jums ir rādītāju un jūs nodot to kā int?
[Bowden] Jūs varat patiešām vienkārši izdrukāt, izmantojot, piemēram, printf.
Pieņemsim, ka man ir int y = 100.
Tātad printf (% d \ n - kā jūs jau zināt - drukāt, ka ar veselu,% x.
Mēs vienkārši izdrukāt to kā heksadecimālo.
Tāpēc rādītājs netiek saglabāta kā heksadecimālā,
un skaitlis netiek saglabāta decimālo.
Viss ir saglabāts kā bināro.
Tas ir tikai, ka mums ir tendence, lai parādītu norādes kā heksadecimālā
jo mēs domājam par lietām šajās 4-baitu blokiem,
un atmiņas adreses mēdz būt pazīstami.
Mēs esam līdzīgi, ja tā sākas ar bf, tad tas notiek, ir uz skursteņa.
Tātad tas ir tikai mūsu interpretācija norādes kā heksadecimālo.
Labi. Jebkuras pēdējie jautājumi?
>> Es būšu šeit, lai mazliet pēc tam, ja jums ir kaut kas cits.
Un tas ir beigas, kas.
>> [Studentu] Yay! [Aplausi]
>> [CS50.TV]