>> [Музички]
>> Даг LLOYD: покажувачи, тука сме.
Ова е веројатно нема да се биде најтешкиот тема
дека ние зборуваме во CS50.
И ако сте ја прочитате ништо за покажувачи
пред да може да биде малку заплашува навлегуваме во оваа видео.
Тоа е вистина покажувачи Дали дозволувате способност
можеби да ја зафркнам прилично лошо кога сте
работи со променливи, и податоци, и предизвикува вашата програма да се сруши.
Но тие се всушност навистина корисни и тие не навистина одличен начин да им овозможи на
да се помине податоци назад и назад помеѓу функции,
дека ние сме тоа не би можеле да се направи.
>> И така што навистина ни е сакате да го направите тука е воз
овозможува да имате добар показател дисциплина, па дека можете да го користите совети ефикасно
да се направи вашиот програми кои многу подобро.
Како што реков покажувачи ни даде различни начин да се помине податоци помеѓу функции.
Сега, ако се потсетиме од поран видео, кога
ние се зборува за опсег на променливите, јас спомнав
дека сите податоци кои ги помине помеѓу функции во C е донесен од вредност.
И јас не може да го користат тоа рок, она што мислев таму
беше дека ја поминуваме копии на податоци.
Кога ќе помине променлива до некоја функција, ние не сме всушност поминува променливата
на функцијата, нели?
Ние сме поминува копија од дека податоците за функцијата.
Функција го прави она што ќе и ја пресметува некоја вредност,
а можеби и ние ги користиме таа вредност кога тоа му дава назад.
>> Имаше еден исклучок да ова правило на минување вредност,
и ние ќе се вратам на она што е малку подоцна во ова видео.
Ако ние ги користиме наместо покажувачи на користење на променливи,
или, наместо користење на променливи сами или копии на променливи,
сега можеме да го положат променливи околу помеѓу функциите на еден поинаков начин.
Ова значи дека ако се направи промена во една функција,
таа промена, всушност, ќе биде потребно ефект во различна функција.
Повторно, ова е нешто што ние не може да се направи претходно,
и ако некогаш сте се обиделе да се разменуваат со вредност на две променливи во функција,
сте забележале овој проблем вид на притаен, нели?
>> Ако сакаме да се разменуваат со X и Y, а ние ги помине на функција наречена swap,
во внатрешноста на функцијата се разменуваат со варијабли се направи размена на вредности.
Еден станува два, два стана еден, но ние всушност не
промени нешто во оригинал функција, во повикувачот.
Затоа што не можеме, ние сме само работа со копии од нив.
Со покажувачи сепак, можеме да всушност помине X и Y до функција.
Таа функција може да го направи нешто со нив.
И овие променливи вредности всушност, може да се промени.
Значи тоа е сосема промена во нашата способност за работа со податоци.
>> Пред да се нурне во покажувачи, мислам дека тоа е вреди да се
преземање на неколку минути за да се се врати на основите тука.
И да го погледне во тоа како компјутерска меморија дела
затоа што овие два предмета се случува всушност да биде прилично меѓусебно поврзани.
Како што веројатно знаете, на вашиот компјутерски систем
имате хард диск или можеби цврста состојба диск,
некој вид на локација за складирање на датотеки.
Тоа е обично некаде во населба од 250 гигабајти
да можеби неколку терабајти сега.
И тоа е каде што сите ваши додадени фајлови: на крајот се живее,
дури и кога вашиот компјутер е исклучен надвор, можете да го вклучите повторно
и ќе најдете вашите датотеки се таму повторно кога ќе го рестартирате Вашиот систем.
Но, диск драјвови, како хард диск, се HDD, или цврста состојба диск, SSD,
се само простор за складирање.
>> Ние не можеме да всушност направи нешто со податоците кои се во хард дискот,
или во цврста состојба диск.
Со цел да го променат податоци или да се движат наоколу,
ние треба да ја преместите во RAM меморија, случаен пристап меморија.
Сега RAM меморија, имате многу помалку на вашиот компјутер.
Можеби ќе треба некаде во населба од 512 мегабајти
ако имате постар компјутер, да можеби две, четири, осум, 16,
можеби дури и малку повеќе гигабајти RAM меморија.
Па тоа е многу помал, но тоа е каде што сите од испарливи податоци постои.
Тоа е каде што ние може да се променат работите.
Но, кога ќе го свртиме нашето компјутерот од штекер, сите на податоците во RAM меморија е уништена.
>> Па затоа треба да имаме хард диск за повеќе трајна локација за тоа,
така што тоа exists- што би биде навистина лошо ако секој пат кога ние
претвори нашиот компјутер надвор, секој датотека во нашиот систем се избришани.
Па ние работиме во внатрешноста на RAM меморија.
И секој пат кога ние зборуваме за меморија, прилично многу, во CS50,
ние зборуваме за RAM меморија, а не на хард дискот.
>> Значи, кога ќе се движат работите во меморијата, тоа трае до одредена сума на просторот.
Сите видови на податоци кои ние сме биле работат со
заземаат различни количини на просторот во RAM меморија.
Така што секој пат кога ќе се создаде цел број променлива, четири бајти меморија
се издвоени во RAM меморија, па да можат да работат со која цел број.
Можете да го прогласам за цел број, го промените, да ја доделите
на вредност 10 зголемува по еден, така натаму и така натаму.
Сето она што треба да се случи RAM меморија, и ќе добиете четири бајти
да се работи со за секој цел број што ќе се создаде.
>> Секој лик што го создаде добива еден бајт.
Тоа е само колку простор е потребни за чување на карактер.
Секој плови, вистинска број, добива четири бајти
освен ако тоа е двојна прецизност подвижна запирка
број, кој ви овозможува да се имаат попрецизно или повеќе цифри
по децималната точка без губење на прецизност,
кои заземаат осум бајти меморија.
Долго копнее, навистина големи цели броеви, исто така, се до осум бајти меморија.
Колку бајти меморија се стрингови потрае?
Па ајде да се стави игла во тоа прашање сега за сега, но ние ќе се вратам на тоа.
>> Па назад кон оваа идеја на меморија, како голема низа на бајт големина клетки.
Тоа е навистина сите што е, тоа е само огромен спектар на клетки,
како и секој друг низа која сте запознаени со и да видиме,
освен секој елемент е широк еден бајт.
И исто како и низа, секој елемент има адреса.
Секој елемент на низа има индекс, а ние
можат да го користат тој индекс да се направи т.н. случаен пристап на низата.
Ние не треба да започне во На почетокот на низата,
iterate преку секоја еден елемент од него,
да се најде она што го барате.
Ние само може да се каже, јас сакам да се дојде до 15-ти елемент или 100-елемент.
И вие само може да се помине во тој број, и добијте ја вредноста што го барате.
>> Слично на секоја локација во меморијата има адреса.
Па вашата меморија на сила изгледа нешто како ова.
Еве еден многу мал дел од меморија, ова е 20 бајти меморија.
Првите 20 бајти, бидејќи мојот обраќа таму на дното
се 0, 1, 2, 3, и така на целиот пат до 19.
И кога ќе се декларираат променливи и кога ќе почнам да работам со нив,
системот се случува да се постави настрана некои простор за мене
во оваа меморија за да работи со моите променливи.
Па јас би рекол, знак в еднаква на капитал Х. И што ќе се случи?
И системот се случува да се резервирани за мене еден бајт.
Во овој случај тоа избра бајт број четири, бајт на адреса четири,
и тоа се случува да го сочувате буквата H во таму за мене.
Ако велам потоа брзина int граница еднаква на 65, тоа е
ќе издвои четири бајти меморија за мене.
И тоа се случува да се третираат оние четири бајти како една единица
затоа што она што ние работиме со е цел број тука.
И тоа се случува да се сместат 65 во таму.
>> Сега веќе и јас сум вид на Ви го кажувам малку лага,
право, затоа што знаеме дека компјутери работа во бинарна.
Тие не разбираат нужно што капитален H е
или она што е на 65, само тие разбере бинарни, нули и единици.
И така, всушност, она што ние сме чување таму
не е буквата Н и број 65, туку на бинарни репрезентации
истата, што изгледа малку нешто како ова.
И особено во контекст на променливата на цел број,
тоа не се случува да само да го плукаат во, тоа не се случува да се третира како една од четири
бајт парче мора да значи, тоа е всушност, се случува
да се третира како еден бајт четири парчиња, која може да изгледа нешто како ова.
Па дури и тоа не е сосема точно или,
бидејќи на нешто што се нарекува една endianness, кои ние не сме
случува да се влезе, но сега ако сте љубопитни за тоа,
можете да го прочитате на мало и големи endianness.
Туку и за доброто на овој аргумент, за доброто на ова видео,
ајде само да се претпостави дека е, во Всушност, како бројот 65 би
да бидат застапени во меморија на секој систем,
иако тоа не е сосема точно.
>> Но, ајде да се, всушност, само се ослободи од сите бинарни во целост,
и само се размислува за што се H и 65, тоа е многу полесно
да се размислува за тоа како дека како човечко суштество.
Добро, така што, исто така, се чини дека можеби малку случаен дека I've- мојот систем
мене не ми даде бајти 5, 6, 7, и 8 за чување на цел број.
Има причина за тоа, исто така, кој ние нема да навлегувам во моментов, но се доволни
тоа е да се каже дека она што компјутер се прави тука
веројатно е добар потег од негова страна.
Да не ми даде меморија, која е мора да се врати назад.
Иако тоа се случува да го направи тоа сега ако сакам да се добие некој друг збор,
наречен презиме, и сакам да се стави Лојд во таму.
Одам да треба да одговара на еден карактер, секоја буква од тоа е
случува да бараат еден карактер, еден бајт од меморијата.
Значи, ако би можел да стави Лојд во мојот низа вака, јас сум прилично добро да се оди, нели?
Што недостасува?
>> Запомни дека секој стринг ние работиме со во C завршува со обратна коса црта нула,
и не можеме да ја изостави дека тука, или.
Ние треба да се издвои еден бајт на меморија за да се одржи дека па ние
знаеш кога нашиот стринг е завршена.
Значи, повторно овој аранжман на начинот на кој работи
се појавуваат во меморија може да да биде малку случаен избор,
но тоа всушност е како повеќето системи се дизајнирани.
Да ги редат на множители на четири, од причини повторно
дека ние не треба да се се влезе во моментов.
Но, ова, па доволно е да се каже дека По овие три линии на код,
тоа е она што може да изгледа како меморија.
Ако ми треба мемориски локации 4, 8, 12 и да се одржи мојот податоци,
тоа е она што може да изгледа како моето сеќавање.
>> И само да биде особено педантни овде, кога
ние зборуваме за меморија адреси ние обично
стори тоа со помош хексадецимална нотација.
Па зошто да не можеме да го конвертирате сите овие од децималниот да хексадецимална нотација
само затоа што тоа е обично како ние се однесуваат на меморија.
Така, наместо да се биде од 0 до 19, она што го имаме е нула
х нула преку нула x1 три.
Тоа се 20 бајти меморија што ние имаат или го гледаме во оваа слика
точно тука.
>> Па сето тоа се рече, ајде чекор подалеку од меморија за втор
и назад до покажувачи.
Тука е најважен е да се запамети
како што ние почнат да работат со покажувачи.
Покажувач ништо повеќе од една адреса.
Јас ќе го кажам уште еднаш, бидејќи тоа е толку важно,
покажувач ништо повеќе од една адреса.
Покажувачи се адресирање на локациите во меморијата каде променливи живеат.
Знаејќи дека тоа станува се надевам малку полесно да се работи со нив.
Друга работа е што ми се допаѓа да се направи е да се вид
на дијаграми визуелно го претставува она што е случува со различни линии на код.
И ние ќе го направите ова неколку пати во покажувачи,
и кога зборуваме за динамичен распределбата на меморија, како и.
Затоа што мислам дека овие дијаграми може да биде особено корисно.
>> Значи, ако јас се каже на пример, цел број k во мојот код, што се случува?
И она што се случува во основа се Јас сум добивање на меморија издвои за мене,
но јас дури и не сакал да се размислува за тоа, како што, јас
сакал да се размислува за тоа како кутија.
Јас имам една кутија и тоа е зелена боја, бидејќи јас
Може да се стави цели броеви во зелени кутии.
Ако тоа беше еден лик јас би можеле да имаат сина кутија.
Но, јас секогаш се каже, ако јас сум создавање кутија која може да се одржи цели броеви
таа кутија е обоена со зелена боја.
И јас земам уште една постојан маркер и јас пишувам к на страна од тоа.
Па имам кутија наречена к, во кои можам да се стави цели броеви.
Значи кога велам int к, тоа е она што се случува во мојата глава.
Ако кажам к еднакво на пет години, што правам?
Па, јас сум ставање пет во полето, во право.
Ова е прилично јасна, ако Велам int к, создаде кутија наречена k.
Ако кажам к еднаква на 5, стави пет во кутија.
Се надевам дека не е премногу голем скок.
Еве каде работите одат на малку интересна иако.
Ако кажам int * PK, добро, дури и ако јас не знаете што е ова мора да значи,
Јасно е дека имам нешто да се направи со цел број.
Па јас ќе одам да се во боја оваа рубрика зелено-носталгичната,
Знам дека имам нешто да се направи со цел број,
но тоа не е сама по себе цел број, затоа што тоа е на int ѕвезда.
Има нешто благо различни за тоа.
Така вклучени цел број е, но во спротивно тоа е
не се премногу различни од она што го зборуваат.
Тоа е една кутија, неговата доби етикета, таа е облечен во PK етикета,
и тоа е способен за одржување int ѕвезди, што и тие се значајни.
Тие имаат нешто да се направи со цели броеви, јасно.
Тука е последната линија, секако.
Ако кажам PK = & К, Леле, што едноставно се случи, нели?
Па овој случаен број, навидум случајни број, добива фрлени во казнениот простор таму.
Сè што е, е PK добива на адресата на k.
Па јас сум држејќи каде k живее во меморијата, адреса, на адресата на неговиот бајти.
Сите правам е јас сум велејќи таа вредност е она што јас ќе одам
да се стави во внатрешноста на мојата кутија наречена PK.
И затоа што овие работи се покажувачи, и затоа бараат
на жиците како нула x осум нула в седум четири осум
два нула е веројатно не е многу значајно.
Кога ние обично се визуелизира покажувачи, ние всушност го прават тоа како покажувачи.
Pk ни дава информации ние треба да се најде к во меморијата.
Значи, во основа има PK стрела во неа.
И ако ние одиме по должина на таа стрелка, се замисли
тоа е нешто што може да одиме на, ако ние шета по должината на тастатурата,
на самиот врв на кој стрела, ние ќе се најде локација во меморијата
каде k живее.
И тоа е навистина важно затоа што кога веќе знаеме каде k живее,
ние може да почне да работи со податоците внатре во тоа мемориска локација.
Иако ние сме добивање на teeny малку понапред од нас сега за сега.
>> Значи она што е покажувачот?
Покажувач е точка а чии податоци вредност е адреса на меморијата.
Тоа беше тоа нулта x осум нула работи случува, тоа беше адреса на меморијата.
Тоа било локација во меморијата.
И видот на покажувач опишува вид
на податоци ќе најдете на дека мемориска адреса.
Па таму е дел од десната int ѕвезда.
Ако јас го следат тоа стрела, тоа е ќе ме доведе до локацијата.
И таа локација, она што можам ќе најдете таму во мојот пример,
е зелена боја кутија.
Тоа е цел број, тоа е она што ќе се најде кога ќе отидам на таа адреса.
Типот податоци на покажувачот опишува она што
ќе најдете на оваа адреса на меморијата.
Значи тука е навистина кул работа, секако.
Покажувачи да ни овозможи да се помине варијабли меѓу функции.
А всушност помине променливи и да не помине копии од нив.
Затоа што ако ние точно знаеме каде во меморијата за да се лоцираат на променлива,
ние не треба да се направи копија од тоа, ние може само да оди на таа локација
и да работат со таа променлива.
Значи, во суштина покажувачи вид за да направи компјутер животната средина
многу повеќе како во реалниот свет, во право.
>> Па еве еден аналогија.
Да речеме дека имам лаптоп, право, а тоа е целосна на белешки.
И јас би сакал да се освежат.
Вие сте функција што ажурирања белешки, во право.
Во начинот на кој ние сме биле работи досега, она што
случува се ќе се земе мојот лаптоп, ќе отидете на продавница на копија,
ќе се направи копија од Xerox секоја страница на тетратка.
Ќе ја напуштам мојата тетратка назад на мојата маса кога ќе завршиш,
ќе се оди и пречкртувам работи во мојот лаптоп, кои се надвор од датумот или не,
и тогаш ќе помине назад кон ме магацинот на Xerox страници
која е реплика на мојот лаптоп со промените што сте направиле за него.
И во тој момент, тоа е до мене, како функцијата за повик, како на повикувачот,
да се одлучиме на вашите белешки и ги интегрира назад во мојот лаптоп.
Значи има многу чекори вклучени тука, нели.
Како не би било подобро ако ли да речеме, еј, може да ви
ажурира мојот лаптоп за мене, ќе го предаде мојот лаптоп,
и да ги преземат работите и буквално ги пречкртувам
и надградба на моите ноти во мојот лаптоп.
А потоа ми даде мојот лаптоп назад.
Тоа е вид на она што покажувачи да ни овозможи да се направи,
тие прават оваа средина многу повеќе личи како оперираме во реалноста.
>> Ред, така што е она што покажувач е, ајде да разговараме
совети за тоа како да работат во C, и како ние може да почнат да работат со нив.
Така што е многу едноставен покажувач во C нарекува нулти покажувач.
Ништовни покажувачот укажува на ништо.
Ова, најверојатно, се чини како да е всушност не е многу корисна работа,
но како што ние ќе ја видите малку подоцна, фактот
дали постои оваа null покажувачот всушност, навистина може да ни се најде.
И секогаш кога ќе се создаде покажувач, и не поставите неговата вредност immediately-
пример за поставување неговата вредност веднаш
ќе биде неколку слајдови назад каде што реков PK еднаква & К,
PK добива адреса к, како ќе видиме што значи дека,
ќе видиме како да кодот што shortly- ако не се постави својата вредност на нешто
значајни веднаш, секогаш треба да
поставите вашиот покажувач на точка на нула.
Треба да го поставите тоа да се укаже на ништо.
>> Тоа е многу различен од само напуштање на вредност како што е
а потоа и за прогласување на покажувач и само под претпоставка
тоа е нула, бидејќи тоа е ретко точно.
Значи секогаш треба да се постави вредноста на покажувач
на нула ако не се постави својата вредност до нешто значајно веднаш.
Можете да проверите дали вредноста е покажувач е нула со користење на операторот на еднаквост
(==), Исто како тебе се споредуваат секој цел број вредности и вредности карактер со користење (==)
исто така.
Тоа е посебен вид на постојана вредност која можете да го користите да се тестираат.
Така што беше многу едноставна покажувач, ништовни покажувачот.
Друг начин да се создаде покажувач е да ја извадиме
адреса на променливата веќе имаш креирано,
и ќе го стори тоа со помош на & оператор адреса екстракција.
Што веќе видовме претходно во првиот пример дијаграм дојдов.
Значи, ако x е променлива што имаме веќе создадени од типот цел број,
тогаш и x е покажувач на цел број.
& x е- се сеќавам, и се случува да се извлече адреса на работа на десната страна.
А од покажувач е само на адреса, отколку & x е покажувач кон цел број
чија вредност е местото каде што во знак на сеќавање х животи.
Тоа е адреса x е.
Така и x е адресата на x.
Да го земеме еден чекор понатаму и да се поврзете со нешто
Се алудира во претходна видео.
Ако ТП е низа на двојки, потоа & ТП квадратни заградата јас е покажувач
на двојно.
ВО РЕД.
ARR квадратни заградата јас, ако ТП е низа на двојки,
тогаш ARR квадратни заградата јас е i-тиот елемент на таа низа,
и & ARR квадратни заградата јас е местото каде што во меморија i-тиот елемент на ТП постои.
>> Значи она што е импликација тука?
Име на низи, импликација на целата оваа работа,
е тоа име низа е всушност се покажувач.
Сте биле работат со покажувачи сите заедно
секој пат кога сте се користи низа.
Се сеќавам од примерот на опсег на променливите,
во близина на крајот на видео I презентираат на пример, каде што имаат функција
наречен сет int и функција наречена сет низа.
И вашиот предизвик да се утврди дали или не, или она што
вредности кои ги испечати на крајот на функцијата,
на крајот од главната програма.
>> Ако се сеќавате од тој пример или ако сте го гледав видеото
Знаете ли дека кога вас-повикот да се сет int ефикасно да не прави ништо.
Но на повикот да се постави низа го прави тоа.
И јас вид на забошотува зошто тоа беше случај во тоа време.
Јас само реков, и тоа е низа, тоа е посебни, знаете, има причина.
Причината е тоа што во низа името е навистина само покажувач,
и таму е овој специјален квадратни заградата синтаксата што
се направат нештата многу поубаво да се работи со.
И тие се направи на идејата за покажувачот многу помалку застрашувачки,
а тоа е зошто тие се вид презентирани на таков начин.
Но, навистина, се само низи покажувачи.
И затоа, кога ние извршена промена на низа,
кога поминувавме низа како параметар до функција или како аргумент
до некоја функција, содржината на низата всушност изменета во двете callee
и во повикувачот.
Што за секој друг вид на променлива видовме не беше случај.
Па тоа е само нешто да се има ум кога си работат со стрелки,
е дека името на една Низа всушност покажувач
на првиот елемент на таа низа.
>> OK, па сега ги имаме сите овие факти, ајде да Продолжувам да одам, во право.
Зошто ни е грижа за каде нешто живее.
И како што реков, тоа е прилично корисно да се знае каде живее нешто
па може да оди таму и да го промени.
Работи со него, а всушност имаат нешто што ви е
сакате да направите за да таа променлива стапи на сила, и нема да има ефект врз некои копија од него.
Ова се нарекува dereferencing.
Одиме на повикување и ние промена на вредноста таму.
Значи, ако ние имаат покажувач и се вика компјутер, и тоа укажува на еден лик,
тогаш можеме да кажеме * * PC и компјутер е името на она што ние ќе се најде ако одиме
до адресата PC.
Она што ние ќе ја најдеш таму е лик и * компјутер е како да се однесуваат на податоците во тоа
локација.
Па ние може да се каже нешто како * PC = D или нешто слично,
и тоа значи дека без оглед на беше во меморијата адреса компјутер,
што и претходно беше карактер таму, сега е D, ако се каже * PC = D.
>> Па тука ќе одиме повторно со С некои чудни работи, нели.
Така што видовме претходно, како да бидат * некако дел на типот податоци,
И сега тоа е се користи во малку поинаков контекст
за пристап до податоците на локација.
Знам дека е малку збунувачки, и тоа е всушност дел од целата оваа
како, зошто совети имаат оваа митологија околу нив, како да бидат толку сложен,
е вид на проблем синтакса, искрено.
* Но се користи и во двете контексти, и како дел од името на видот,
и ќе видиме малку подоцна нешто друго, исто така.
И во моментов е на оператор dereference.
Па тоа оди на референца, тоа пристапи на податоци
на локацијата на покажувач, и Ви овозможува да манипулираат со тоа по своја волја.
>> Сега ова е многу слично на во посета на вашиот сосед, во право.
Ако знаете што вашиот сосед живее, ти си
не дружење со вашиот сосед.
Знаете што се случи да знаат каде живеат,
но тоа не значи дека со врз основа на тоа дека знаењето
вие сте во интеракција со нив.
Ако сакате да комуницирате со нив, ќе мора да оди на нивната куќа,
треба да се оди до таму каде што живеат.
И штом еднаш ќе го направите тоа, тогаш можете да комуницирате
со нив, исто како што би сакале да.
И слично, со променливи, што треба да одиме на нивната адреса
ако сакате да ги комуницираат, вие не само да знаеш адресата.
И начинот на кој ќе се обратите на адреса е да се користи *, операторот на dereference.
Што мислите дека се случува ако се обидеме и dereference
покажувач чија вредност е нула?
Потсетиме дека нултата покажувачот покажува кон ништо.
Значи, ако се обидете и dereference ништо или да се врати на адреса што ништо,
што мислите што се случува?
Па ако претпоставам сегментација вина, ќе бидете во право.
Ако се обидете и dereference нулти покажувач,
страдате сегментација вина. Но, чекај,
не ви велам, дека ако не си оди
да го поставите вашата вредност на вашиот Покажувач на нешто значајно,
треба да го поставите на нула?
Јас не и всушност, сегментација грешка е еден вид на добро однесување.
>> Дали некогаш сте прогласена за променлива и Не се доделени од неговата вредност веднаш?
Па да речеме int x; ти не всушност, да ја доделите на ништо
а потоа подоцна во вашиот код, можете да испечатите на вредноста на x,
уште не се има го доделило на ништо.
Често ќе добиете нула, но понекогаш ти
Може да се добијат некои случајни броеви, и немате поим од каде доаѓа.
Слично може да работи случи со покажувачи.
Кога ќе се изјасни за покажувачот int * PK на пример,
а вие не ја доделите на вредност, ќе добиете четири бајти за меморија.
Што и четири бајти на меморијата на системот може да
најде дека има некои значајни вредност.
И дека може да се нешто што е веќе таму, кои
повеќе не е потребно од страна на друг функција, па вие само треба
сите други податоци што беше таму.
>> Што ако сте се обиделе да се направи dereference некои адресата што ја don't- имало
веќе бајти и информации во таму, тоа е сега во вашиот покажувач.
Ако се обидете и dereference дека покажувач, може да се Месинг со некои меморија
дека не планираат да се плеткаме со сето тоа.
И во фактот што можеше да стори нешто навистина катастрофални,
како да се пробие на друга програма, пауза или друга функција,
или да направи нешто што малициозен не планираат да се направи на сите.
И така тоа е зошто тоа е всушност добра идеја
да го поставите вашиот покажувач на нула ако не ги поставите на нешто значајно.
Тоа е можеби подобро во крајот на денот за вашата програма
да се сруши, тогаш за тоа да се направи нешто што завртки
друга програма или друга функција.
Таквото однесување е веројатно дури и помалку идеална отколку само да паѓа.
И така тоа е зошто тоа е всушност добра навика
да се влезе за да го поставите вашиот покажувачи на нула ако не ги постави
на значајни вредност веднаш, односно вредноста не дека знаете
и дека вие можете безбедно да го дереференцира.
>> Значи, да се врати сега и да погледнам на целокупната синтаксата на ситуацијата.
Ако кажам int * стр ;, Што сум само направено?
Она што го направив е ова.
Знам дека вредноста на p е адреса бидејќи сите покажувачи се само
адреси.
Можам dereference стр користење на операторот на *.
Во овој контекст, тука, на самиот Топ потсетиме на * е дел од тип.
Int * е тип на податок.
Но, можам да dereference Па со операторот на *,
и ако јас го стори тоа, ако одам на таа адреса, што ќе се најдам на таа адреса?
Јас ќе се најде цел број.
Па int * р е во основа велејќи: p е адреса.
Можам dereference p и ако Јас, јас ќе се најде цело број
во тоа мемориска локација.
>> Добро па што реков, има уште еден досадни нешто со ѕвезди
и тука е местото каде што досадни нешто со ѕвезди е.
Дали некогаш сте се обиделе да се изјасни повеќе променливи од ист вид
на иста линија на кодот?
Така и за секунда, се преправам дека линијата, кодот Јас всушност имаат таму во зелена
не е таму и тоа само вели int x, y, z ;.
Она што би го направил е, всушност, се создаде три целобројни променливи за вас,
еден вика x, еден вика y и z се вика.
Тоа е начин да го направи тоа без морале да се подели со три линии.
>> Еве каде ѕвездите се досадни повторно иако,
бидејќи * е всушност дел и на име на тип и дел
на името на променливата.
И така, ако кажам int * пиксели, PY, PZ, она што можам всушност е покажувач кон цел број
наречен пиксели и два цели броеви, PY и PZ.
И дека веројатно не на она што е сакаме, тоа не е добро.
>> Па ако сакам да се создаде повеќе покажувачи на иста линија, од ист вид,
и ѕвезди, она што всушност треба да направите е да се каже int * Па, * ФБ, * PC.
Сега има само рече дека а сега ти го кажувам ова,
што веројатно никогаш нема да го направите тоа.
И тоа е веројатно добра работа чесно, затоа што можеби ненамерно
изостави ѕвезда, така нешто.
Тоа е веројатно најдобро е да можеби се изјасни покажувачи на поединечните линии,
но тоа е само уште еден од оние досадни синтакса
работи со ѕвезди, кои го покажувачи толку тешко да се работи со.
Бидејќи тоа е само оваа синтаксичка хаос ќе мора да работат преку.
Со практиката го прави тоа навистина стане втора природа.
Јас се уште се прават грешки со тоа сепак по програмирањето за 10 години,
па не се вознемири ако нешто се случува за вас, тоа е доста заеднички за чесно.
Тоа е навистина вид на недостаток на синтаксата.
>> Ok, па јас вид на ветената дека ќе го ревидира
концептот за тоа како голем е стринг.
И ако сум ви кажал дека стринг, ние сме навистина вид на
се лаже за вас цело време.
Нема податоци за видот наречен стринг, и всушност јас
споменав ова во еден од нашите Најраните видеа на типови на податоци,
таа низа е тип на податоци кои беше создадена за вас во cs50.h.
Што треба да # Include Cs50.h со цел да го користам.
>> И низа е навистина само алијас за нешто
наречен char *, односно Покажувач на карактер.
И покажувачи, да се потсетиме, се само се обраќа.
Значи она што е големината во бајти на стринг?
Па тоа е четири или осум.
А причината велам четири или осум е поради тоа што, всушност,
зависи од системот, Ако користите CS50 IDE, char * е со големина на знак
* Има осум години, тоа е 64-битен систем.
Секој адреса во меморијата е долга 64 бита.
Ако сте со користење CS50 апаратот или користите 32-битна машина,
и сте слушнале овој термин 32-битна машина, што е 32-битна машина?
И тоа само значи дека секој адреса во меморијата е долга 32 бита.
И така 32 бита е четири бајти.
Па еден знак * се четири или осум бајти во зависност од вашиот систем.
И навистина било типови на податоци, и покажувач кон сите податоци
тип, бидејќи сите покажувачи се само адреси, четири или осум бајти.
Значи, да се ревидира оваа дијаграм и да заклучиме
ова видео со малку вежба тука.
Значи тука е дијаграм што застанавте со уште на почетокот на видеото.
Значи она што се случува сега, ако кажам * PK = 35?
Значи она што значи тоа кога велам, * PK = 35?
Се земе втора.
* PK.
Во контекстот, * е оператор dereference.
Па кога dereference оператор се користи,
одиме на адресата посочена да страна PK, а ние се промени она што го наоѓаме.
Така * PK = 35 ефикасно го прави ова на сликата.
Така, тоа е во основа синтаксички идентична на кој рече k = 35.
>> Уште едно.
Ако кажам int m, Јас создавам нова променлива наречена m.
Нова кутија, тоа е зелено поле, затоа што тоа се случува да се одржи на цел број,
и тоа се етикетирани м.
Ако кажам m = 4, јас се стави цел број во таа кутија.
Ако речеме PK = & M, колку чини оваа промена дијаграм?
PK = & M, дали се сеќавате што & Оператор прави или се вика?
Се сеќавам дека и некои име на променлива е адресата на име на променлива.
Значи она што си ти што зборуваш е PK добива на адресата на м.
И така ефикасно да она што се случува на дијаграм е дека веќе не PK поени
да к, но поени за м.
>> Повторно покажувачи се многу незгодно да се работи со
и тие се многу пракса, туку затоа што
на нивната способност да ви овозможи да се помине податоци помеѓу функции
а всушност имаат оние промени во сила,
добивање на вашата глава околу е навистина важно.
Тоа веројатно е најкомплицираниот темата ќе разговараат во CS50,
но ја вредноста што тој добиете од користење покажувачи
мера го надминува компликации кои доаѓаат од нив учење.
Па јас Ви посакувам најдоброто од среќа за учење за покажувачи.
Јас сум Даг Лојд, ова е CS50.