1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Недела 4, Продолжува] 2 00:00:02,310 --> 00:00:04,240 [Дејвид Џ Malan - Универзитетот Харвард] 3 00:00:04,240 --> 00:00:07,290 [Ова е CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Ова е CS50, и ова е крајот на 4 недели. 5 00:00:11,290 --> 00:00:14,030 Па некои добри вести и некои лоши вести. 6 00:00:14,030 --> 00:00:26,240 Нема предавање во понеделникот, нема проблем постави следната недела. [Студенти навива] 7 00:00:26,240 --> 00:00:28,680 Вие не сте ќе се допаѓа кога тоа се случува. 8 00:00:28,680 --> 00:00:31,590 Но, ние не ја имаат оваа, наместо следната среда, 9 00:00:31,590 --> 00:00:37,740 и таму е исто така на наставната програма 1 Петок предавање следниот петок, така што ќе може да остане на вистинскиот пат. 10 00:00:37,740 --> 00:00:40,580 Но, сè ќе биде снимен како и обично, па не се грижи. 11 00:00:40,580 --> 00:00:44,100 >> И во однос на квизот 0 она што ние ќе направиме кон крајот недела 12 00:00:44,100 --> 00:00:47,140 е пост на почетната страница од пребарувачот cs50.net на курсот објаснување 13 00:00:47,140 --> 00:00:50,160 на она што вид на очекувањата треба да имаат кога станува збор за првиот квиз. 14 00:00:50,160 --> 00:00:55,100 Во принцип, тоа ќе биде повеќе избор, точно-неточно, краток одговор, кратко кодирање проблеми. 15 00:00:55,100 --> 00:00:57,360 Вие не ќе треба да се очекува да го спроведат еквивалент 16 00:00:57,360 --> 00:01:00,030 на проблемот што ќе видите на pset, за кои имате компјутер 17 00:01:00,030 --> 00:01:03,240 и дебагерот и слично, но ќе има мала кодирање проблеми. 18 00:01:03,240 --> 00:01:06,900 >> И навистина, најдобар водич да се добие чувство на она што CS50 квизови се како 19 00:01:06,900 --> 00:01:09,180 е да отидете на cs50.net, одете на квизови линк, 20 00:01:09,180 --> 00:01:11,920 и можете да видите во изминатите неколку години во вредност од квизови. 21 00:01:11,920 --> 00:01:16,600 Само сфатат дека наставната програма не е секогаш ист во текот на годините. 22 00:01:16,600 --> 00:01:18,510 Понекогаш ние го додадете, понекогаш одземаат, 23 00:01:18,510 --> 00:01:20,670 па ако видите некои тема на една од оние стари квизови 24 00:01:20,670 --> 00:01:25,380 дека немате поим што го зборува, тоа е или што ние не се покрие 25 00:01:25,380 --> 00:01:27,210 или дека ние не се покрие. 26 00:01:27,210 --> 00:01:31,110 Но, во форма на критика, ова недела, понеделник и вторник 27 00:01:31,110 --> 00:01:34,770 како и се разбира-широк преглед сесија во неделата вечер - 28 00:01:34,770 --> 00:01:37,500 Времето и локацијата ќе бидат објавени на почетната страница на курсот - 29 00:01:37,500 --> 00:01:40,120 ќе имаат можност да се видат со настава соработници на курсот 30 00:01:40,120 --> 00:01:44,830 материјалот за оваа година, и во дел и како полноправна класа, 31 00:01:44,830 --> 00:01:48,400 и оние кои ќе се снима како и обично, како и. 32 00:01:48,400 --> 00:01:53,380 >> Во ред. Значи без натамошно одложување, еден коментар на Поминете / не и да го додадете / капка. 33 00:01:53,380 --> 00:01:57,980 Може да се види моите ноти минатата ноќ, и ова е навистина само некои дополнителни успокојување 34 00:01:57,980 --> 00:02:01,250 дека ако сте меѓу оние особено помалку удобно или некаде помеѓу 35 00:02:01,250 --> 00:02:04,870 и ти си чувствувајќи се само малку во над вашата глава, 36 00:02:04,870 --> 00:02:08,430 сфатите дека е навистина сосема нормално, и има обилна поддршка структура во место, 37 00:02:08,430 --> 00:02:13,530 од кои една канцеларија часа беа намера за подобрување сè повеќе и повеќе на мојот е-мејл минатата ноќ, 38 00:02:13,530 --> 00:02:16,520 и ќе сфати дека премногу опција како Поминете / не за класа вака 39 00:02:16,520 --> 00:02:21,540 навистина е замислена како механизам да се на работ надвор од курсот, како таков, 40 00:02:21,540 --> 00:02:24,200 така што повторно ако сте трошење на тие 10, 15, 20 часа 41 00:02:24,200 --> 00:02:28,160 само се обидува да добие некои pset да работат и да знаете дека сте 90-95% од пат таму 42 00:02:28,160 --> 00:02:32,100 но не можете да најдете некои проклети бубачки, во Поминете / не модел кој е еден вид на ред. 43 00:02:32,100 --> 00:02:36,230 >> Идејата е дека со тој механизам тогаш може да оди фокус на другите psets 44 00:02:36,230 --> 00:02:39,530 или спијат или што е тоа што сакате да се фокусираме. 45 00:02:39,530 --> 00:02:43,390 Така сфаќаат дека имаат рок до ова доаѓа вторник - технички 5 Понеделник, 46 00:02:43,390 --> 00:02:50,840 но тоа е празник, така што ова доаѓа вторник - да се префрлат од Поминете / не успеваат да оценето или обратно. 47 00:02:50,840 --> 00:02:54,450 И ако сте навистина на пропаст и се размислува за напуштање целосно, 48 00:02:54,450 --> 00:02:56,440 Ве молиме фати мене по предавање или мене капка белешка. 49 00:02:56,440 --> 00:02:59,990 Ние би сакале да барем разговор пред вас предлог Збогувајте. 50 00:02:59,990 --> 00:03:03,470 Во ред. Значи почнавме преземање на обука тркала надвор последен пат. 51 00:03:03,470 --> 00:03:06,030 Конкретно, ние се фокусиравме на стрингот. 52 00:03:06,030 --> 00:03:09,740 Стринг е нешто што е прогласена во библиотеката CS50, 53 00:03:09,740 --> 00:03:14,340 конкретно во таа датотека се нарекува cs50.h која ќе започне да се погледне во оваа недела и следната. 54 00:03:14,340 --> 00:03:17,250 Но стринг е навистина само поедноставување на нешто 55 00:03:17,250 --> 00:03:20,980 тоа е малку повеќе arcanely опиша како знак *. 56 00:03:20,980 --> 00:03:24,090 Char ние сме запознаени со. Тоа е само еден лик. 57 00:03:24,090 --> 00:03:28,010 Но, * од понеделник означена што? >> [Студент] покажувач. 58 00:03:28,010 --> 00:03:31,290 А покажувач. И, што е покажувач? >> [Студент] Еден адреса. 59 00:03:31,290 --> 00:03:33,420 >> Тоа е како адреса, локација во меморијата. 60 00:03:33,420 --> 00:03:35,910 Што е адреса или локација или меморија? 61 00:03:35,910 --> 00:03:40,290 Повторно, сите од нас имаат лаптопи со свирка или 2 гигабајти RAM меморија, најверојатно, овие денови, 62 00:03:40,290 --> 00:03:44,160 и тоа значи дека има милијарди денари или 2 милијарди бајти во вредност од меморија. 63 00:03:44,160 --> 00:03:46,240 И тоа не е важно она што физички личи, 64 00:03:46,240 --> 00:03:51,220 но ги преземе за вербата дека може да нумерира сите индивидуални бајти кои свој лаптоп има - 65 00:03:51,220 --> 00:03:54,580 ова е бајт 0, тоа е бајт 1, ова е бајт 2 милијарди - 66 00:03:54,580 --> 00:03:56,100 и тоа е токму она компјутер го прави тоа. 67 00:03:56,100 --> 00:04:00,030 Кога ќе одвои простор за еден лик, на пример, 68 00:04:00,030 --> 00:04:02,480 очигледно треба да живеат некаде во меморијата на вашиот компјутер, 69 00:04:02,480 --> 00:04:05,860 а можеби и тоа е во бајт број 12345, 70 00:04:05,860 --> 00:04:08,470 и тоа е некаде тука во меморијата на вашиот компјутер. 71 00:04:08,470 --> 00:04:12,630 И адресата тогаш дека карактерот е 12345. 72 00:04:12,630 --> 00:04:16,140 >> Сега, во недела од 0 до сега засега, не сме навистина се грижи 73 00:04:16,140 --> 00:04:19,170 каде во меморијата работите се чуваат, бидејќи ние обично користат симболи, 74 00:04:19,170 --> 00:04:22,540 променливи, и низи да всушност во нашите податоци. 75 00:04:22,540 --> 00:04:24,950 Но, од понеделник и сè повеќе и повеќе денес, ти си сега се случува да имаат 76 00:04:24,950 --> 00:04:27,710 сè повеќе и повеќе експресивна способности со пишување програми 77 00:04:27,710 --> 00:04:31,330 навистина да се манипулира меморијата на компјутерот сепак ви одговара, 78 00:04:31,330 --> 00:04:33,720 за добри цели и лоши, 79 00:04:33,720 --> 00:04:39,620 грешки се многу честа резултат во овој момент во учењето на овој материјал. 80 00:04:39,620 --> 00:04:42,460 Но, она што значи тоа навистина значи да се биде char *? 81 00:04:42,460 --> 00:04:46,140 Ајде да одиме напред назад - и ние ќе се врати на Binky како што вети денес. 82 00:04:46,140 --> 00:04:48,670 Ајде да одиме во еден едноставен пример тука. 83 00:04:48,670 --> 00:04:53,060 Дозволете ми да ја зачувате оваа датотека како compare.c, и дозволете ми да се добијат некои дефиниција код овде 84 00:04:53,060 --> 00:05:00,490 така вклучуваат stdio.h, дозволете ми, исто така, си даде вклучуваат cs50.h. Јас ќе зумирате до таму. 85 00:05:00,490 --> 00:05:05,850 Дозволете ми да започнете со пишување главната int, главната (празно), и сега сакам да направам нешто како ова: 86 00:05:05,850 --> 00:05:13,520 printf ("Дај ми стринг:"), а потоа јас ќе ја користи низа на добива GetString 87 00:05:13,520 --> 00:05:16,750 да се добие стринг од корисникот, а потоа јас ќе одам да побара од корисникот за друг. 88 00:05:16,750 --> 00:05:21,870 ("Дај ми уште еден стринг:") и јас ќе одам да ги прашате преку GetString да се добие тоа. 89 00:05:21,870 --> 00:05:27,020 Јас ќе го наречеме т бидејќи т доаѓа откако ги и S е убаво име за низа ако тоа е прилично генерички. 90 00:05:27,020 --> 00:05:30,030 Значи GetString, и сега сакам само да се направи здрав разум чек и јас одам да се каже 91 00:05:30,030 --> 00:05:39,770 ако (а == t) тогаш јас сум само ќе кажам на корисникот printf ("Внесовте истото \ n!"); 92 00:05:39,770 --> 00:05:45,520 друго јас ќе одам да се печати нешто како ("Внесовте нешто различно! \ n") 93 00:05:45,520 --> 00:05:48,460 или што казната ќе биде. Значи такво нешто. 94 00:05:48,460 --> 00:05:52,200 Тогаш, како и обично, јас ќе се врати 0, кои само значеше дека ништо лошо се случи, 95 00:05:52,200 --> 00:05:54,400 и јас одам да се оди напред и компајлирајте и извршете оваа програма. 96 00:05:54,400 --> 00:05:56,540 >> Но, во понеделникот ние трчаше оваа програма, 97 00:05:56,540 --> 00:06:00,420 и всушност беше кажано дека ЗДРАВО не е здраво и ЗБОГУМ не е збогум. 98 00:06:00,420 --> 00:06:03,140 Однесувањето видовме беше малку повеќе вака. 99 00:06:03,140 --> 00:06:11,450 Дозволете ми да одам во мојата изворниот директориум, зум во тука, и нека го прават споредуваат. 100 00:06:11,450 --> 00:06:14,570 Составувач ред. Дозволете ми да се кандидира споредуваат. Дај ми стринг: ЗДРАВО. 101 00:06:14,570 --> 00:06:16,300 Дај ми уште еден стринг: ЗДРАВО. 102 00:06:16,300 --> 00:06:18,000 Сте ја внеле нешто различно! 103 00:06:18,000 --> 00:06:22,650 Па, дозволете ми да се обиде нешто поедноставно како 50, 50. Сте ја внеле нешто различно! 104 00:06:22,650 --> 00:06:25,740 Здраво, здраво. Па јасно, нешто се случува тука. 105 00:06:25,740 --> 00:06:28,440 Но, она што е објаснување зошто? 106 00:06:28,440 --> 00:06:33,850 Очигледно, линија 12 е целосно нефункционален. 107 00:06:34,300 --> 00:06:39,430 Што е фундаментален проблем тука? Да. >> [Студент] Тоа е споредување на адреси. 108 00:06:39,430 --> 00:06:41,850 Да, точно. Тоа е всушност споредување на адреси 109 00:06:41,850 --> 00:06:44,580 во која Здраво и ЗДРАВО се чуваат. 110 00:06:44,580 --> 00:06:48,290 Тоа не е споредување на писма Здраво повторно, и повторно, 111 00:06:48,290 --> 00:06:52,370 затоа што навистина се случило, сето ова време ние сме биле користење GetString - 112 00:06:52,370 --> 00:06:56,130 Оваа табла е повторно меморија нашиот компјутер, 113 00:06:56,130 --> 00:07:00,100 и да речеме јас го нарекувам GetString по прогласувањето променлива s. 114 00:07:00,100 --> 00:07:01,930 Што значи моето сеќавање изгледа? 115 00:07:01,930 --> 00:07:07,070 Да произволно да се каже дека е изгледа вака. Тоа е плоштад. 116 00:07:07,070 --> 00:07:09,040 И доста секое време сум подготвен парче меморија на екранот 117 00:07:09,040 --> 00:07:12,860 ако тоа е 32 бита сум бил цртеж плоштади како тоа затоа што навистина во апаратот, 118 00:07:12,860 --> 00:07:17,380 покажувач, адреса, е 32 бита. Тоа е исто како int. 119 00:07:17,380 --> 00:07:19,420 Тоа може да се разликуваат врз основа на компјутерски систем. 120 00:07:19,420 --> 00:07:24,630 Оние од вас кои се нејасно запознаени со фактот дека вашиот Mac или PC е 64 бита, 121 00:07:24,630 --> 00:07:28,120 кои, всушност, означува дека вашиот компјутер е користење на 64-битна покажувачи, 122 00:07:28,120 --> 00:07:33,730 64-битна адреси, а меѓу квит сум за тоа е вашите компјутери 123 00:07:33,730 --> 00:07:35,560 може да има многу повеќе RAM меморија од недалечното минато. 124 00:07:35,560 --> 00:07:39,240 Скратам приказната, назад во денот, кога компјутерите се користи само 32 бита 125 00:07:39,240 --> 00:07:42,740 да претставуваат адреси, најголемиот број на бајти може да претставуваат 126 00:07:42,740 --> 00:07:46,280 во тој случај е што ако имате 32 бита? 127 00:07:46,280 --> 00:07:49,590 Значи 4 милијарди долари, право, бидејќи 2 до 32 изнесува 4 милијарди долари. 128 00:07:49,590 --> 00:07:51,370 Овој број е повторуваат во текот. 129 00:07:51,370 --> 00:07:55,240 >> Значи, ако имате само 32 бита, најголем број може да смета на е околу 4 милијарди долари. 130 00:07:55,240 --> 00:07:58,750 Но тоа беше основен ограничување на компјутери до пред неколку години 131 00:07:58,750 --> 00:08:01,180 затоа што ако може само да се смета како високо како 4 милијарди долари, 132 00:08:01,180 --> 00:08:05,270 тоа не е важно ако ги купите 8 гигабајти RAM или дури и 5 гигабајти RAM меморија; 133 00:08:05,270 --> 00:08:07,780 не може да смета дека високите, па тоа беше бескорисно. 134 00:08:07,780 --> 00:08:11,430 Вие само може да пристапите на првите 3 или 4 гигабајти на меморија на вашиот компјутер. 135 00:08:11,430 --> 00:08:14,410 Тоа е помалку од еден проблем сега, и може да се купи MacBook професионалци и Долчинка 136 00:08:14,410 --> 00:08:17,680 со 8 гигабајти RAM или дури и повеќе, овие денови. 137 00:08:17,680 --> 00:08:24,100 Но, ако јас одвои сосема едноставно во оваа програма покажувач, покажувач наречен с, 138 00:08:24,100 --> 00:08:28,370 тоа може да изгледа вака на екранот, бидејќи навистина треба да лупам назад овој слој. 139 00:08:28,370 --> 00:08:33,520 Продолжувам да велејќи стринг, но од понеделник, стринг е навистина char *, 140 00:08:33,520 --> 00:08:35,590 адресата на некои карактер. 141 00:08:35,590 --> 00:08:39,280 Значи, да се земе дека обуката велосипед иако ние ќе продолжиме со користење GetString за сега. 142 00:08:39,280 --> 00:08:42,600 Значи јас сум прогласена е, и ова е парче меморија, 32 бита. 143 00:08:42,600 --> 00:08:47,370 Што е тука во меморија по дифолт? >> [Нечујни студент одговор] 144 00:08:47,370 --> 00:08:50,040 Што е тоа? >> [Студент] ѓубре. >> Ѓубре. Точно. 145 00:08:50,040 --> 00:08:54,610 Ако на програмерот не стави вредност во променлива, кој знае што е тоа? 146 00:08:54,610 --> 00:08:57,990 Понекогаш ќе имаат среќа и тоа е 0, кој е вид на убаво, чисто стандардната вредност, 147 00:08:57,990 --> 00:09:00,310 но како што видовме Понеделник, понекогаш тоа е целосна глупост, 148 00:09:00,310 --> 00:09:04,130 некои навистина голем позитивен или негативен број, кои дојдоа од каде? 149 00:09:05,350 --> 00:09:07,010 Да. >> [Студент] Функцијата порано. >> Да. 150 00:09:07,010 --> 00:09:10,170 >> Често функција која доби наречена порано, бидејќи се сеќавам, 151 00:09:10,170 --> 00:09:13,920 како да ти се јавам функции во меморијата, тие заземаат повеќе простор од дното нагоре, 152 00:09:13,920 --> 00:09:17,040 и штом функцијата се враќа, дека меморија добива пренаменети 153 00:09:17,040 --> 00:09:20,890 од следниот дечко што се нарекува, кој е со користење на вашиот исто парче на меморија. 154 00:09:20,890 --> 00:09:23,450 И ако сте лево ѓубре таму, претходните вредности, 155 00:09:23,450 --> 00:09:28,190 ние би можеле грешка е што има некои вредност, кога навистина не можеме да се стави нешто таму. 156 00:09:28,190 --> 00:09:30,960 Така, нашето RAM меморија во овој момент изгледа вака. 157 00:09:30,960 --> 00:09:36,030 Сега на десната страна на линијата 7 ние сме повикувајќи GetString, 158 00:09:36,030 --> 00:09:40,150 кој го прави сега со недели, но она што е GetString навистина прави? 159 00:09:40,150 --> 00:09:43,350 GetString напишани од страна на CS50 персонал е малку интелигентни 160 00:09:43,350 --> 00:09:46,500 во таа штом корисникот ќе почне пишување клучеви и хитови Enter, 161 00:09:46,500 --> 00:09:50,010 GetString фигури колку тастатурата не на корисникот хит, 162 00:09:50,010 --> 00:09:53,360 колку знаци ми е потребно за да се распредели RAM меморија за. 163 00:09:53,360 --> 00:09:55,660 И каде што RAM меморија доаѓа од, кој знае? 164 00:09:55,660 --> 00:09:58,930 Тоа е некаде во 2 гигабајти на вашиот компјутер или какво ли на меморија. 165 00:09:58,930 --> 00:10:05,200 Но, ајде да претпоставиме дека компјутерот се најде простор за зборот ЗДРАВО овде. 166 00:10:05,200 --> 00:10:08,710 Зборот ми чука беше H-Е-Л-Л-О. 167 00:10:08,710 --> 00:10:13,510 И ако ние се подготви ова како секвенца од знаци, можеби ќе го нацрта тоа како оваа. 168 00:10:13,510 --> 00:10:17,860 Но јас треба да направите 1 екстра работа. Она што му припаѓа на крајот на која било низа во C? 169 00:10:17,860 --> 00:10:20,710 На нула карактер, што ние пишуваме како \ 0. 170 00:10:20,710 --> 00:10:23,980 Тоа е технички бројот 0, но обратна коса црта прави сите појасна 171 00:10:23,980 --> 00:10:28,150 дека ова е буквално бројот 0, број 0; 172 00:10:28,150 --> 00:10:32,440 тоа не е, на пример, цитат-unquote 0 што може да пишувате на тастатурата. 173 00:10:32,440 --> 00:10:33,940 Значи ова е здраво. 174 00:10:33,940 --> 00:10:36,350 >> И што велиме во понеделникот изјави дека некоја функција како GetString 175 00:10:36,350 --> 00:10:39,580 е всушност враќање на сите овие недели? 176 00:10:39,580 --> 00:10:43,960 Тоа не е враќање низа по себе, бидејќи тоа навистина не имаат значење 177 00:10:43,960 --> 00:10:47,710 бидејќи жиците не постојат. Тие се вид на измислица во CS50 библиотека. 178 00:10:47,710 --> 00:10:51,300 Она што е навистина низа, повеќе технички? >> [Студент] Тоа е првиот лик. 179 00:10:51,300 --> 00:10:55,950 Точно. Тоа е сосема едноставно адресата на првиот знак дека корисникот внеле внатре 180 00:10:55,950 --> 00:11:02,810 Значи, ако мојот збор ЗДРАВО тој завршува во бајт број 123, а потоа во бајт број 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, и така натаму, ако јас само бројот мојот бајти од 0 на горе, 182 00:11:08,320 --> 00:11:12,650 она што навистина GetString се враќа е буквално на бројот 123. 183 00:11:12,650 --> 00:11:19,270 Значи она што добива се стави во с е бројот 123, а не на буквата Н, а не збор Здраво, 184 00:11:19,270 --> 00:11:23,130 едноставно адресата на која може да се најде на првата буква од Здраво. 185 00:11:23,130 --> 00:11:26,500 Но, тоа не изгледа доволно. Те прашав за низа, а не карактер. 186 00:11:26,500 --> 00:11:32,970 Така како ние или компјутерот знае дека ello вид на дојде заедно со H? 187 00:11:35,760 --> 00:11:37,460 Што е вид на договор имаме? Да. 188 00:11:37,460 --> 00:11:40,100 [Студент] Се држи кажувам себе да се најдат некои повеќе карактери. >> Токму така. 189 00:11:40,100 --> 00:11:44,570 >> Има оваа човековите-компјутер согласност со која кога ќе се занимаваат со жици, 190 00:11:44,570 --> 00:11:49,410 инаку позната сега како знак ѕвезди, кои едноставно мораш да дознаам 191 00:11:49,410 --> 00:11:54,350 каде што на крајот на секој стринг во животот е од навистина само процесирањето над неа со за телефонска линија, 192 00:11:54,350 --> 00:11:57,820 време јамка, без разлика, така што кога ќе се најде на крајот од стрингот 193 00:11:57,820 --> 00:12:02,160 сега може да заклучиме од тоа, о, целиот збор е здраво. 194 00:12:02,160 --> 00:12:04,820 Оние од вас со претходно програмирање искуство може да знае во Јава 195 00:12:04,820 --> 00:12:09,880 можете само да се јавам. должина и на други јазици можете да се јавите должина или слично. 196 00:12:09,880 --> 00:12:14,060 Тоа е затоа што во многу јазици, особено нешта наречени објектно-ориентирани јазици, 197 00:12:14,060 --> 00:12:18,580 должината на нешто не е во вид на внесен во внатрешноста на парче на податоци себе, 198 00:12:18,580 --> 00:12:24,000 многу како што врзуваат лични карти и имиња и куќи во внатрешноста на еден студент во понеделникот. 199 00:12:24,000 --> 00:12:28,700 Но, C е многу пониско ниво. Нема предмети или класи, ако сте слушнале овие услови порано. 200 00:12:28,700 --> 00:12:31,490 Се што треба е навистина мемориски адреси. 201 00:12:31,490 --> 00:12:35,540 Па ова е вид на старомоден начин на претставување на интересни структури на податоци. 202 00:12:35,540 --> 00:12:38,760 Имате почеток вредност како адресата на првиот карактер 203 00:12:38,760 --> 00:12:42,340 а потоа само некои произволни конвенцијата дека сите се согласуваат да го следат. 204 00:12:42,340 --> 00:12:46,420 Па, како е стринг должина спроведува, не ние предлагаме? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, што некои од вас сега се користи неколку пати. Тоа е прилично едноставно, нели? 206 00:12:51,360 --> 00:12:53,060 Тоа е како 2 линии на код. 207 00:12:53,060 --> 00:12:56,140 Тоа е доста за телефонска линија на некој вид, можеби со дополнителни локални променливи. 208 00:12:56,140 --> 00:13:00,540 Но strlen едноставно мора да се земе покажувач, а потоа почнете да барате \ 0. 209 00:13:00,540 --> 00:13:05,190 >> И штом го најде, тоа може да се врати од вкупниот број на чекори што е донесена во таа низа. 210 00:13:05,190 --> 00:13:07,150 Значи можеме да заклучиме од ова што се случува понатаму. 211 00:13:07,150 --> 00:13:11,850 Да претпоставиме дека потоа Изјавувам т како што го направив во линија 10. 212 00:13:11,850 --> 00:13:14,280 Ова е некои ѓубре вредност. Кој знае во првиот? 213 00:13:14,280 --> 00:13:18,490 Но, од десната страна на линија на 10 јас го повикувам GetString повторно. 214 00:13:18,490 --> 00:13:20,050 Кој знае каде овој завршува? 215 00:13:20,050 --> 00:13:23,830 Да произволно да се каже дека на оперативниот систем се најде простор за тоа начин овде. 216 00:13:23,830 --> 00:13:28,610 Јас се случи да случајно тип В-Е-Л-Л-О, повторно, 217 00:13:28,610 --> 00:13:31,260 и така ние може да нацрта на ист вид на сликата. 218 00:13:31,260 --> 00:13:34,290 Но, фактот дека сум сменет оваа слика е намерно 219 00:13:34,290 --> 00:13:37,720 бидејќи тоа е друга ЗДРАВО од оваа. 220 00:13:37,720 --> 00:13:43,920 Па еве ова може да биде локација 456, ова е 457, и така натаму. 221 00:13:43,920 --> 00:13:47,170 Значи она што добива се стави каде што прашалник некогаш беше? 222 00:13:47,170 --> 00:13:50,190 Во овој случај 456. 223 00:13:50,190 --> 00:13:53,540 Ние сме подигање овие бројки произволно, бидејќи навистина после денес 224 00:13:53,540 --> 00:13:57,110 ние нема да се грижат толку многу за она што на адреса на ништо е. 225 00:13:57,110 --> 00:14:02,690 Сите ние сме загрижени за е дека можеме да дознаам адресата на некои парче на податоци како ЗДРАВО. 226 00:14:02,690 --> 00:14:07,100 >> Па навистина она што повеќето луѓе прават во компјутерската наука, кога зборуваме за мемориски адреси 227 00:14:07,100 --> 00:14:10,210 и зборуваме за совети конкретно, 228 00:14:10,210 --> 00:14:14,220 наместо мачат да пронајдат 123 - кој се грижи каде овој материјал всушност е, 229 00:14:14,220 --> 00:14:17,440 ние само знам дека тоа е во некои нумерички адреса - 230 00:14:17,440 --> 00:14:22,180 ние поедноставување на светот и само велат дека е се укажува на тоа карактер 231 00:14:22,180 --> 00:14:25,080 и т е покажувајќи на тој лик. 232 00:14:25,080 --> 00:14:27,430 И фактот дека тоа е стрела е сосема намерно 233 00:14:27,430 --> 00:14:31,610 бидејќи буквално сега s е покажувајќи кон H и т е да се покажува на другите H 234 00:14:31,610 --> 00:14:34,720 бидејќи на крајот на денот, тоа не е важно она што адресата е, 235 00:14:34,720 --> 00:14:40,240 но тоа не е важно што имаме можност да ја изразат таа адреса со некои парче код. 236 00:14:40,240 --> 00:14:42,730 Не сме навистина манипулира овие адреси само уште 237 00:14:42,730 --> 00:14:47,770 па ќе видиме каде можеме да interject и сортирање на не работи со покажувачи, 238 00:14:47,770 --> 00:14:52,030 но сега за сега во линија 12 буквално она вредности сме споредување 239 00:14:52,030 --> 00:14:55,500 според оваа приказна во линија 12? 240 00:14:56,570 --> 00:15:01,290 Ние сме велејќи дека е 123 еднаков еднаков на 456? И тоа е дефинитивно не е случај. 241 00:15:01,290 --> 00:15:05,320 Па дури и концептуално, овој покажувачот дефинитивно не е исто како во овој 242 00:15:05,320 --> 00:15:09,500 затоа што се нарекува GetString двапати, и GetString не се обидува да биде супер паметни, 243 00:15:09,500 --> 00:15:12,470 таа не се обидува да се реализира, ох, сте ја внеле ЗДРАВО 5 минути; 244 00:15:12,470 --> 00:15:15,090 дозволете ми да ви даде истиот покажувач како што ви даде пред, 245 00:15:15,090 --> 00:15:18,450 тоа само алоцира нов дел од меморија секој пат кога ќе го наречеме. 246 00:15:18,450 --> 00:15:20,350 >> Така како ние да го надминете овој проблем? 247 00:15:20,350 --> 00:15:24,270 Ако повисоко ниво Сакам да се споредат жици ЗДРАВО и здраво - 248 00:15:24,270 --> 00:15:28,680 Не ми е гајле за совети - како можам да се обратите за одговарање на прашањето, 249 00:15:28,680 --> 00:15:31,980 не на корисникот напишете иста работа? Што е потребно овде? Да. 250 00:15:31,980 --> 00:15:35,200 [Студент] Користете функција. >> Јас се користи некоја функција надвор од кутијата. 251 00:15:35,200 --> 00:15:38,170 Јас може да се користи функција наречена strcmp, S-т-р-в-м-p, 252 00:15:38,170 --> 00:15:41,190 само скратена верзија на велејќи стринг споредуваат. 253 00:15:41,190 --> 00:15:45,070 И ако ние одиме во, на пример, да ги споредиме 2, кој е меѓу материјалите денес, 254 00:15:45,070 --> 00:15:46,690 Јас го прават токму тоа. 255 00:15:46,690 --> 00:15:51,750 Продолжив сè друго на истиот од алинеја 1 на одредување на 26 или така, 256 00:15:51,750 --> 00:15:54,360 и сега забележите овој дел се промени само малку. 257 00:15:54,360 --> 00:15:57,690 Да се ​​игнорира линија 28 за момент и да се фокусира само на оваа. 258 00:15:57,690 --> 00:16:00,410 Што велиме понеделникот изјави дека ул Споредете не? 259 00:16:00,410 --> 00:16:05,200 Тоа се справува со процесот на преземање 2 покажувачи, S и T во овој случај, 260 00:16:05,200 --> 00:16:08,480 вид на практично стави својот прст на оние 2 букви, 261 00:16:08,480 --> 00:16:11,530 и она што треба да направите е нешто како додека јамка или за телефонска линија, 262 00:16:11,530 --> 00:16:16,050 и вели дека се овие исти? Ако е така, што се движи прстите или совети напред. 263 00:16:16,050 --> 00:16:17,970 Дали овие исти, овие исти, овие исти, 264 00:16:17,970 --> 00:16:22,710 овие исти, овие исти? И ooh, јас сум на крајот на низата на двата s и t. 265 00:16:22,710 --> 00:16:26,780 Јас не сум нашол некое противречности. Да, овие низи се исти. 266 00:16:26,780 --> 00:16:31,940 И она што го прави ул спореди враќањето ако 2 жици се исти, очигледно? Нула. 267 00:16:31,940 --> 00:16:35,900 Значи 0 е добро во овој случај, бидејќи ако го враќа -1 или 1, 268 00:16:35,900 --> 00:16:40,560 тоа значи дека е само случува да дојде пред т по азбучен ред или по т. 269 00:16:40,560 --> 00:16:43,760 И зошто тоа би било корисно да се има функција која ти го кажува кој стринг доаѓа пред 270 00:16:43,760 --> 00:16:46,720 или после во речникот? 271 00:16:46,720 --> 00:16:48,740 [Студент] Пребарување. >> Пребарување и подредување. 272 00:16:48,740 --> 00:16:51,730 >> Па можете да ги правите нештата како бинарен за пребарување или меурот вид или спои вид 273 00:16:51,730 --> 00:16:53,230 каде што треба да се споредуваат работите. 274 00:16:53,230 --> 00:16:56,420 Досега ние сме вид на намалување на некои делови и само зборуваше за сортирање 275 00:16:56,420 --> 00:16:59,430 во контекст на броеви, бидејќи тоа е убаво и лесно да се зборува за, 276 00:16:59,430 --> 00:17:02,430 но сигурно може да се спореди жици, јаболко и банана, 277 00:17:02,430 --> 00:17:05,349 бидејќи ако јаболко е познат да дојде пред банана, слично на тоа, 278 00:17:05,349 --> 00:17:09,319 можете да се движите жици околу во меморијата како Роб не со спојување вид во видео 279 00:17:09,319 --> 00:17:15,880 и ние го сторивме тука на сцената со изборот вид, вметнување вид, и меур вид. 280 00:17:15,880 --> 00:17:18,710 Значи каде на друго место може да се земе ова? Да се ​​обидеме ова. 281 00:17:18,710 --> 00:17:23,980 Ајде вид на заборавиме дека лекција за момент и обидете се сега и ископирајте 1.в да го направите следново. 282 00:17:23,980 --> 00:17:26,800 Во линија 21 сакам да кажам дека печати нешто, 283 00:17:26,800 --> 00:17:28,520 тогаш јас сум добивање на стринг од корисникот, 284 00:17:28,520 --> 00:17:30,690 тогаш јас сум проверка ова. 285 00:17:30,690 --> 00:17:33,620 Не сме навистина добивано и во оваа навика сеуште, но ајде сега го направите тоа. 286 00:17:33,620 --> 00:17:40,990 Да, всушност, лупам назад овој слој. Ова е навистина char *. Овој човек е навистина char *. 287 00:17:40,990 --> 00:17:45,690 Па што значи тоа да се провери дали е == NULL? 288 00:17:45,690 --> 00:17:48,380 Излегува дека кога ќе се јавите на функција како GetString 289 00:17:48,380 --> 00:17:51,540 или поопшто само побарајте на компјутерот да ви даде некои меморија, 290 00:17:51,540 --> 00:17:53,030 нешто може да тргне наопаку. 291 00:17:53,030 --> 00:17:56,630 Вие би можеле да бидат луди и го прашуваат компјутерот за Terabyte на меморија 292 00:17:56,630 --> 00:18:01,780 барајќи трилиони бајти од меморија, која едноставно не постојат во компјутерот, 293 00:18:01,780 --> 00:18:05,130 но GetString и други функции треба некој начин на вика на тебе 294 00:18:05,130 --> 00:18:06,820 ако сте праша за премногу. 295 00:18:06,820 --> 00:18:10,450 И начинот GetString го прави ова е ако се побара повеќе меморија 296 00:18:10,450 --> 00:18:14,250 отколку што е на располагање во компјутер, дури и ако тоа е супер, супер ниска веројатност 297 00:18:14,250 --> 00:18:17,730 бидејќи никој од нас не се случува да напишете трилиони карактери, а потоа притиснете ентер, 298 00:18:17,730 --> 00:18:21,980 но ниска веројатност иако тоа може да биде, јас се уште сакате да се провери за тоа само во случај, 299 00:18:21,980 --> 00:18:26,120 и посебна вредност која GetString, одговор, и други функции се враќа 300 00:18:26,120 --> 00:18:30,630 ако нешто не е во ред е NULL во сите настапи. 301 00:18:30,630 --> 00:18:36,520 >> И она што е NULL? NULL само така се случува да ја претставува покажувач. Тоа е меморија адреса 0. 302 00:18:36,520 --> 00:18:40,800 Светот одлучи дека произволно, ако ова е меморија на компјутерот ми е - знаеш што? - 303 00:18:40,800 --> 00:18:46,260 ние ќе украдат само 1 бајт од меморија секој компјутер, и ова е локација 0. 304 00:18:46,260 --> 00:18:49,560 Ние ќе го даде прекарот NULL, и ние ќе ветување 305 00:18:49,560 --> 00:18:52,660 дека ние всушност никогаш не ќе се стави реални податоци таму 306 00:18:52,660 --> 00:18:56,770 бидејќи ние само произволно треба посебна вредност, 0, ака NULL, 307 00:18:56,770 --> 00:19:00,230 така што можеме да се развикам на корисниците ако нешто тргне наопаку. 308 00:19:00,230 --> 00:19:03,590 Инаку може да не знам е 0 значи стави нешто тука 309 00:19:03,590 --> 00:19:05,490 или значи тоа нешто не беше во ред? 310 00:19:05,490 --> 00:19:09,190 Ние треба да сите се согласуваат дека NULL не значи ништо се врати, 311 00:19:09,190 --> 00:19:11,700 Нема вистинската адреса се врати. 312 00:19:11,700 --> 00:19:15,210 Сега, еве јас сум само донесување мојот човечки конвенцијата на вратам 1 од главната 313 00:19:15,210 --> 00:19:17,040 ако нешто тргне наопаку. 314 00:19:17,040 --> 00:19:20,650 Тоа е затоа што враќањето конвенција главните е да се врати 0, ако добро, 315 00:19:20,650 --> 00:19:22,990 1 или некоја друга вредност, ако лошо. 316 00:19:22,990 --> 00:19:28,200 Но GetString и секоја функција која се занимава во меморијата враќа NULL ако нешто тргне лошо. 317 00:19:28,200 --> 00:19:33,480 >> Во ред. Така, за жал, линија 27, супер едноставен покрај тоа што е, потполно не успее да ја копирате на стрингот. 318 00:19:33,480 --> 00:19:35,740 Зошто? Можеме да видиме ова како што следува. 319 00:19:35,740 --> 00:19:40,120 Јас сум тврдејќи дека во линија 27 да се прави копија на s и нарекувајќи го т. 320 00:19:40,120 --> 00:19:45,790 Па јас не барам на корисникот за 2 жици овој пат, јас сум само велејќи вредноста во с 321 00:19:45,790 --> 00:19:47,870 треба да се стави во т, како и. 322 00:19:47,870 --> 00:19:52,890 Па сега само да се покаже како скршени ова е, во линија 29 па наваму што правам? 323 00:19:52,890 --> 00:19:56,980 Прво јас сум проверка, ако должината на т е поголем од 0. 324 00:19:56,980 --> 00:19:59,330 Има некои стринг таму. Корисникот внесе нешто внатре 325 00:19:59,330 --> 00:20:03,410 Што е линија 32 прави, очигледно? 326 00:20:03,410 --> 00:20:08,910 [Нечујни студент одговор] >> Право. Можете вид на може да го заклучиме од она што го рече тоа го прави. 327 00:20:08,910 --> 00:20:13,200 Но технички, она што е оваа правиш? → [0] претставува она? 328 00:20:13,200 --> 00:20:15,140 [Студент] Ликот 0.. >> [Malan] Ликот 0.. 329 00:20:15,140 --> 00:20:19,620 Или, повеќе човечко-како, првиот карактер во т, што и да е, H можеби во овој случај. 330 00:20:19,620 --> 00:20:24,990 И toupper го прави она што го кажува. Тоа капитализира на 0. карактер на T и тоа се менува. 331 00:20:24,990 --> 00:20:28,430 Значи ова значи преземат 0. карактер на T, го прават тоа големи букви, 332 00:20:28,430 --> 00:20:30,320 и го стави назад во истата локација. 333 00:20:30,320 --> 00:20:35,540 Значи, ако јас внесете здраво со мали букви, ова треба да се менува на мали часот на капитал Х 334 00:20:35,540 --> 00:20:41,400 Но, проблемот е во тоа што во линии 35 и 36 што јас сум за да направите е да испечатите за нас s и t. 335 00:20:41,400 --> 00:20:43,120 И она што е вашето комат? 336 00:20:43,120 --> 00:20:47,250 Што сум јас, всушност, ќе видиме, ако јас ја внеле во здраво во сите мали букви? 337 00:20:47,250 --> 00:20:52,280 Што се случува да се печатат? >> [Нечујни студент одговор] >> Што е тоа? 338 00:20:52,280 --> 00:20:58,360 [Студент] Биг H и останатите мали. >> Големите H и останатите мали за кое s или t? 339 00:20:58,360 --> 00:21:03,170 [Студент] И. >> Двете. Точно. Па ајде да видиме што се случува овде. 340 00:21:03,170 --> 00:21:08,380 >> Дозволете ми да оди напред и да ги собере тие. Ова е copy1, така бидете copy1. Во ред. 341 00:21:08,380 --> 00:21:14,840 Зумирате внатре Дозволете ми да оди напред и да ја стартувате copy1, Внесете, Кажи нешто: hello со мали букви. 342 00:21:14,840 --> 00:21:19,570 Тоа капитализирани копија, но тоа очигледно капитализирани на оригиналот, 343 00:21:19,570 --> 00:21:22,070 затоа што она што сега се случува во оваа приказна? 344 00:21:22,070 --> 00:21:27,030 Во согласност 27 Јас всушност не се чини дека се копирање на стринг, 345 00:21:27,030 --> 00:21:30,450 но иако можеби сте интуитивно се надева дека за да биде случај, 346 00:21:30,450 --> 00:21:33,680 ако мислиш за оваа слика, она што навистина сум направил? 347 00:21:33,680 --> 00:21:35,410 Половина од сликата е иста. 348 00:21:35,410 --> 00:21:39,390 Значи, да се тркалаат назад во времето, така што т сеуште не постои во приказната. 349 00:21:39,390 --> 00:21:43,160 С може да постои во приказната, но ајде мали букви Здраво ова време. 350 00:21:43,160 --> 00:21:46,710 Па нека ме поправи она што јас всушност внесе внатре 351 00:21:46,710 --> 00:21:51,280 Во овој случај, тука имаме ж-е-л-л-о. 352 00:21:51,280 --> 00:21:58,050 Ние ќе го нацрта како секвенца од знаци, ставам сепаратор линии тука и мојот \ 0. 353 00:21:58,050 --> 00:22:05,980 Значи ова е местото каде што ние сме во најкраток линија од 1 до 24-носталгичната, или дава да потрае, се егзекутирани. 354 00:22:05,980 --> 00:22:07,800 Ова е слика на моето сеќавање. 355 00:22:07,800 --> 00:22:10,800 Кога ќе стигнете до линијата 27, што се случува? 356 00:22:10,800 --> 00:22:14,730 Исто како и пред тоа, јас се добие покажувач, што ќе привлече како овој плоштад. 357 00:22:14,730 --> 00:22:19,740 Таа се вика т. И, што е неговата вредност по дифолт? Кој знае? Некои ѓубре вредност. 358 00:22:19,740 --> 00:22:22,060 >> Затоа јас ќе апстрактни дека далеку како знак прашалник. 359 00:22:22,060 --> 00:22:27,670 И штом десната страна на линијата 27 извршува, што зборувам ставање во внатрешноста на Т? 360 00:22:27,670 --> 00:22:30,770 Истото тоа е во с. 361 00:22:30,770 --> 00:22:34,120 Значи, ако ние за момент го отстраните овој апстракција на стрелката и ние велиме, 362 00:22:34,120 --> 00:22:40,330 ох, ова е меморија оптоварување адреса 123, кога ќе се каже т добива с, запирка, 363 00:22:40,330 --> 00:22:42,700 сте буквално ставајќи 123 овде. 364 00:22:42,700 --> 00:22:45,200 Сега ако ние вид на поедноставување на нашиот свет повторно со слики, 365 00:22:45,200 --> 00:22:48,750 она што сте навистина направено е само додаде уште стрелката за да вашиот свет 366 00:22:48,750 --> 00:22:52,910 тоа е посочувајќи од т на истиот точната низа. 367 00:22:52,910 --> 00:22:59,730 Значи, кога во согласност 31 и 32 Јас всушност се обратите за менување на т [0], 368 00:22:59,730 --> 00:23:05,580 што е т [0] очигледно синоним сега? Кликнете [0] 369 00:23:05,580 --> 00:23:07,030 Значи тоа е сето она што се случува. 370 00:23:07,030 --> 00:23:09,900 И иако овој вид на се чувствува малку ниско ниво и таинствени 371 00:23:09,900 --> 00:23:12,760 и овој вид на чувствувам како можеби интуитивно ова треба да имаат само работеше - 372 00:23:12,760 --> 00:23:15,410 Јас направив копии на нештата пред и само работеше - 373 00:23:15,410 --> 00:23:18,590 ако навистина размислува за она што низа навистина е, тоа е знак *. 374 00:23:18,590 --> 00:23:21,700 Па, што е тоа? Тоа е адресата на некои карактер. 375 00:23:21,700 --> 00:23:24,930 Тогаш можеби тоа го прави повеќе смисла дека кога ќе се обидат да сторат нешто 376 00:23:24,930 --> 00:23:29,220 супер навидум едноставна, како таков, се што правиш е копирање на мемориска адреса. 377 00:23:29,220 --> 00:23:32,530 Вие не сте всушност прави ништо со низа себе. 378 00:23:32,530 --> 00:23:37,500 Па дури и ако немаат идеја како ќе се реши овој проблем во кодот, 379 00:23:37,500 --> 00:23:45,080 високо ниво, концептуално, она што ние треба да се направи со цел да се направи ta верна копија на с, очигледно? 380 00:23:46,670 --> 00:23:48,820 Да. >> [Студент] Дајте нова локација? >> Токму така. 381 00:23:48,820 --> 00:23:50,800 >> Ние треба да се даде т сосема нова локација. 382 00:23:50,800 --> 00:23:55,230 Ние треба некако да се создаде свет во кој ние се добие нов дел од меморијата, 383 00:23:55,230 --> 00:24:00,090 кои само заради јасност е јас ќе привлече веднаш под овој, но тоа не треба да биде таму. 384 00:24:00,090 --> 00:24:04,880 Но, тоа треба да биде со иста големина, па ќе се нацрта овие вертикални линии на истото место. 385 00:24:04,880 --> 00:24:09,720 Тоа е во ред, ако тоа е за сите ѓубре на почетокот. Кој знае што е таму? 386 00:24:09,720 --> 00:24:13,850 Но, чекор 1 ќе треба да се ми даде колку меморија како што треба 387 00:24:13,850 --> 00:24:18,630 за да ги собере копија од здраво, а потоа дознаам како да го копирате ж тука, е тука, 388 00:24:18,630 --> 00:24:20,390 на л тука и така натаму. 389 00:24:20,390 --> 00:24:24,880 Но, ова веќе треба да се чувствуваат малку очигледно дури и ако некои од деталите се уште апстрактна. 390 00:24:24,880 --> 00:24:28,690 За да копирате оваа низа во ова, тоа е само за јамка или додека јамка 391 00:24:28,690 --> 00:24:31,580 или нешто со кое сте стане сè повеќе и повеќе познати. 392 00:24:31,580 --> 00:24:35,970 Значи, да се обидат ова. Дозволете ми да одат во copy2.c. 393 00:24:35,970 --> 00:24:43,270 Во copy2.c имаме речиси иста програма, освен за линијата 27. 394 00:24:43,270 --> 00:24:47,260 Тоа изгледа малку комплексна, но ако ние го срушат парче по парче, 395 00:24:47,260 --> 00:24:48,950 на левата страна е иста. 396 00:24:48,950 --> 00:24:52,790 Char * т создава оваа работа во меморијата, иако со прашалник 397 00:24:52,790 --> 00:24:54,680 затоа што немаат идеја што е таму од стандардните. 398 00:24:54,680 --> 00:24:57,920 На десната страна ние сме сега за воведување на нова функција, Примерок, 399 00:24:57,920 --> 00:25:00,640 за мемориски одвои, дај ми меморија, 400 00:25:00,640 --> 00:25:06,900 и тоа очигледно зема како многу аргументи, колку многу нешта во заграда? 401 00:25:09,660 --> 00:25:12,130 Слушнав мрморења на 1 и 2, но тоа е само 1. 402 00:25:12,130 --> 00:25:15,320 Нема запирка, што значи дека има само 1 работа внатре во заградите. 403 00:25:15,320 --> 00:25:17,720 Иако има други загради, дозволете ми да се потенцира 404 00:25:17,720 --> 00:25:21,460 она што е внатре на најоддалечените загради, и тоа е тоа израз: 405 00:25:21,460 --> 00:25:25,880 (Strlen (а) + 1) * sizeof (знак). 406 00:25:25,880 --> 00:25:29,190 Значи, ако ние всушност мислам дека ова преку, ова е велејќи ми даде должината на пријавите. 407 00:25:29,190 --> 00:25:34,440 Зошто сум јас, иако, додавајќи 1 кон должина? >> [Нечујни студент одговор] 408 00:25:34,440 --> 00:25:40,200 Точно. Ние треба простор за овој човек на опашката, шестиот карактер што нема Македонски значење 409 00:25:40,200 --> 00:25:42,250 но не имаат посебни програмски значење. 410 00:25:42,250 --> 00:25:46,800 >> Значи ние треба + 1 за тоа, бидејќи strlen враќа човечкиот очекување на должина, 411 00:25:46,800 --> 00:25:50,890 здраво или 5, не ви даде дополнителни null карактер. 412 00:25:50,890 --> 00:25:52,980 Па јас рачно да додадете ова со + 1. 413 00:25:52,980 --> 00:25:56,060 А потоа и оваа, * големината на (char), не сме виделе досега. 414 00:25:56,060 --> 00:25:57,480 Ова не е технички функција. 415 00:25:57,480 --> 00:26:04,150 Тоа е посебен клучен збор, која само ти кажува она што големина е на некои податочен тип на компјутер 416 00:26:04,150 --> 00:26:06,980 затоа што во реалноста, некои од нас имаат 32-битни компјутери. 417 00:26:06,980 --> 00:26:10,900 Имам прилично стар компјутер дома, и тоа само користи 32 битови да претставуваат покажувачи. 418 00:26:10,900 --> 00:26:13,900 И така ако сум го правела големина на тип на податоци, тоа може да биде 32 бита. 419 00:26:13,900 --> 00:26:18,300 Но, ако јас сум користење на мојот нов фенси компјутер, би можел да се вратам во вредност од 64 бита 420 00:26:18,300 --> 00:26:20,510 за нешто како адреса. 421 00:26:20,510 --> 00:26:25,400 Значи во овој случај, само за да биде супер безбедно, ние нема да тешко код нешто како - 422 00:26:25,400 --> 00:26:28,740 Па, што е со големина на знак, според она што рековме досега? 423 00:26:28,740 --> 00:26:34,450 Ние сме доста изјави усно дека тоа е 1 бајт, и тоа е доста точно во одборот. 424 00:26:34,450 --> 00:26:37,000 Но, повторно, претпоставки имаат тенденција да бидат лоши. 425 00:26:37,000 --> 00:26:40,850 Тие водат до кабриолет софтвер, ако луѓето го користите вашиот софтвер во начини на кои можете не планираат. 426 00:26:40,850 --> 00:26:44,750 Па ајде апстрактни оваа далеку и само повеќе генерички каже 427 00:26:44,750 --> 00:26:46,830 Ми треба оваа многу делови од меморијата 428 00:26:46,830 --> 00:26:50,210 и секој дел од меморија треба да биде еднаква на големината на еден лик, 429 00:26:50,210 --> 00:26:54,870 која е всушност еднаква на 1, во овој случај, но тоа е повеќе генерички начин на пишување неа. 430 00:26:54,870 --> 00:27:00,460 Значи, ако зборот е здраво, колку бајти е Примерок очигледно одвои за здраво? 431 00:27:00,460 --> 00:27:04,980 [Студент] Шест. >> Шест. Точно колку што имаме прашалници на екранот. 432 00:27:04,980 --> 00:27:07,800 А потоа ги погоди сега врз основа на вашето разбирање на GetString 433 00:27:07,800 --> 00:27:12,790 што значи Примерок веројатно се врати? >> [Студент] Еден адреса. 434 00:27:12,790 --> 00:27:17,020 Адреса на што? На првиот дел од меморијата. 435 00:27:17,020 --> 00:27:20,670 >> Немаме поим што е таму, бидејќи некои други функција 436 00:27:20,670 --> 00:27:23,010 може да се користи оваа меморија претходно. 437 00:27:23,010 --> 00:27:28,380 Но Примерок, како GetString, се враќа адресата на првиот бајт од меморија 438 00:27:28,380 --> 00:27:30,540 дека ги издвои за вас. 439 00:27:30,540 --> 00:27:38,380 Сепак, она што не го направите е да се пополни во празно со обратна коса црта null карактер 440 00:27:38,380 --> 00:27:43,030 бидејќи излегува можете да го користите Примерок да одвои нешто: ints, стрингови, низи, 441 00:27:43,030 --> 00:27:45,700 плови, студентски структури. 442 00:27:45,700 --> 00:27:47,750 Можете да ги користите Примерок целосно генерички. 443 00:27:47,750 --> 00:27:51,470 Таа не се грижи или треба да знаете што сте доделување меморија за. 444 00:27:51,470 --> 00:27:55,810 Значи тоа ќе биде претенциозно за Примерок да се стави \ 0 445 00:27:55,810 --> 00:27:58,340 на крајот на секој дел од меморијата тоа е ви даваат 446 00:27:58,340 --> 00:28:02,620 бидејќи ова \ 0 работа е само конвенција за стрингови. 447 00:28:02,620 --> 00:28:06,310 Тоа не се користи за ints, тоа не е се користи за плови, тоа не е се користи за студентите. 448 00:28:06,310 --> 00:28:11,730 И така gotcha со Примерок е дека товарот е целосно сте програмер 449 00:28:11,730 --> 00:28:16,790 да се сетам колку бајти можете доделени и да не некогаш користите за телефонска линија 450 00:28:16,790 --> 00:28:21,570 или додека јамка и одат минатото границата на дел од меморијата сте биле дадени. 451 00:28:21,570 --> 00:28:23,540 Стави некој друг начин, веднаш штом ќе алоцира меморија, 452 00:28:23,540 --> 00:28:28,510 не можете да побарате на оперативниот систем, ох, патем, колку е голема на парче меморија беше ова? 453 00:28:28,510 --> 00:28:32,080 Тоа е целосно зависи од вас да се сеќавам ако ви треба таа вредност. 454 00:28:32,080 --> 00:28:34,330 >> Да видиме како јас да продолжи да ја користите оваа меморија. 455 00:28:34,330 --> 00:28:38,430 Во согласност 28 и 29 зошто правам ова? 456 00:28:39,850 --> 00:28:42,260 Само вкупниот разумност проверка. 457 00:28:42,260 --> 00:28:45,110 Само во случај нешто не беше во ред, го прашувам за некои луди сума на меморија 458 00:28:45,110 --> 00:28:48,690 или имам толку многу работи работи на компјутер кој има само не е доволно меморија, 459 00:28:48,690 --> 00:28:51,780 нешто слично на тоа, јас барем сакате да се провери за ништовни. 460 00:28:51,780 --> 00:28:55,260 Во реалноста, повеќето компјутери ќе ви даде илузија дека секоја програма 461 00:28:55,260 --> 00:28:57,080 можете да го користите на интегритет на вашата RAM меморија, 462 00:28:57,080 --> 00:29:00,740 но дури и така, ако на корисникот видови во некои луди долга низа можеби затоа што тие се лошо момче 463 00:29:00,740 --> 00:29:03,440 и тие всушност се обидува да сруши вашата програма или пробие во неа, 464 00:29:03,440 --> 00:29:07,300 дека сакате да барем се провери повратната вредност на Примерок и дали тоа е еднакво на нула. 465 00:29:07,300 --> 00:29:11,630 И ако го прави тоа, ајде само да престанам токму сега, бидејќи не знам што да правам во тој случај. 466 00:29:11,630 --> 00:29:13,950 Како да го ископирате стринг? Има неколку начини да го направите тоа. 467 00:29:13,950 --> 00:29:18,850 Постојат ул копирајте функции во C, но тоа е супер едноставен за нас да го направите тоа на старомоден начин. 468 00:29:18,850 --> 00:29:23,110 >> Прво дозволете ми да дознаам што должината на пријавите е. 469 00:29:23,110 --> 00:29:26,930 Јас можев да се стави ова во јамка, но наместо тоа само да го стави овде за јасност. 470 00:29:26,930 --> 00:29:30,610 Значи n сега продавници должината на оригиналната низа, што е очигледно 5. 471 00:29:30,610 --> 00:29:35,290 Тогаш според мое за јамка јас сум процесирањето од 0 на до n, 472 00:29:35,290 --> 00:29:40,940 и на секоја итерација Јас сум ставање на [i] внатрешноста на т [i]. 473 00:29:40,940 --> 00:29:45,060 Значи тоа е она што се подразбира со моите 2 прстите посочувајќи на жици порано. 474 00:29:45,060 --> 00:29:49,260 Како ова за јамка iterates вака, јас одам да се копирање часот во тука, 475 00:29:49,260 --> 00:29:52,890 е во тука, л во тука, бидејќи ова е с, ова е т. 476 00:29:52,890 --> 00:29:58,770 А потоа на крај, во согласност 35 зошто правам ова? 477 00:29:58,770 --> 00:30:03,770 Јас треба да бидете сигурни дека јас сум крај на стрингот t. 478 00:30:03,770 --> 00:30:06,170 И јас го направив тоа на овој начин да биде супер експлицитни. 479 00:30:06,170 --> 00:30:09,510 Но, предложи, некој, ако може, на поинаков начин да се направи ова. 480 00:30:09,510 --> 00:30:13,930 Јас навистина не треба линија 35. Има уште еден начин да го направите тоа. 481 00:30:13,930 --> 00:30:18,880 Да. >> [Нечујни студент одговор] >> Велат дека тоа погласно. 482 00:30:18,880 --> 00:30:20,960 [Студент] Помалку од или еднакво на. >> Токму така. 483 00:30:20,960 --> 00:30:24,450 Ние може само да се каже помалку од или еднакво на n, кој воопшто е лоша 484 00:30:24,450 --> 00:30:28,190 бидејќи скоро секогаш кога одиме до еднаква на нешто ние сме броење 485 00:30:28,190 --> 00:30:30,000 одиме 1 чекор предалеку. 486 00:30:30,000 --> 00:30:32,170 Но запомнете, колку бајти не ни одвои? 487 00:30:32,170 --> 00:30:37,210 Ние распределени strlen на s, така 5 + 1 за вкупно 6. 488 00:30:37,210 --> 00:30:39,980 Значи во овој случај би можеле да направите нешто како ова 489 00:30:39,980 --> 00:30:46,450 така што ние сме копирање не само здраво, но исто така и \ 0 на самиот крај. 490 00:30:46,450 --> 00:30:49,860 Алтернативно, би можеле да ги користат функција наречена ул копија, strcpy, 491 00:30:49,860 --> 00:30:51,700 но тоа не би било речиси како многу забавно. 492 00:30:51,700 --> 00:30:54,000 Но тоа е сè тоа го прави под хауба. 493 00:30:54,000 --> 00:30:56,050 Тогаш на крај, ние го прават истото како порано. 494 00:30:56,050 --> 00:31:01,620 Јас профитираат т а потоа тврдам дека оригиналниот изгледа вака и копија личи тоа. 495 00:31:01,620 --> 00:31:08,570 Значи, да се обидат на оваа сега. Дозволете ми да одат во тука. Направете copy2. Ние ќе зумирате и да ја стартувате copy2. 496 00:31:08,570 --> 00:31:13,840 Одам да напишеш во здраво со мали букви, и навистина ми се мали букви здраво како и оригиналот 497 00:31:13,840 --> 00:31:16,930 но капитал Здраво за копија. 498 00:31:16,930 --> 00:31:20,300 Но, јас не сум сторил само уште. Јас треба да направите 1 последното нешто тука. 499 00:31:20,300 --> 00:31:28,000 46 и 47 е јасно ослободи меморија, но што всушност значи? 500 00:31:28,000 --> 00:31:33,250 Што правам, дали мислите дека, со повикување линија 46 и линија 47? 501 00:31:33,250 --> 00:31:38,900 Каков ефект не дека имаат? Да. 502 00:31:38,900 --> 00:31:43,140 [Нечујни студент одговор] >> Токму така. 503 00:31:43,140 --> 00:31:46,380 >> Вие сте само кажува на оперативниот систем, еј, благодарение на оваа меморија. 504 00:31:46,380 --> 00:31:48,320 Сега можете да го користите за некој друг. 505 00:31:48,320 --> 00:31:50,790 И тука е совршен пример на ѓубре вредности. 506 00:31:50,790 --> 00:31:55,430 Јас само се користи оваа меморија за да се запишам на зборот здраво за 2 места, 507 00:31:55,430 --> 00:31:57,490 тука, тука, тука и тука. 508 00:31:57,490 --> 00:32:00,910 Значи ова е ж-е-л-л-о-\ 0. 509 00:32:00,910 --> 00:32:06,960 Но, тогаш јас го нарекувам линија 46 и линија 47, а вие знаете што се случува таму, во смисла на сликата? 510 00:32:06,960 --> 00:32:10,010 Всушност, чекај, оваа слика е стар една. 511 00:32:10,010 --> 00:32:12,550 Откако ќе се направи копија, овој човек е, всушност, посочувајќи тука, 512 00:32:12,550 --> 00:32:16,110 па ајде отстрани броеви и само апстрактни далеку како нашите стрели повторно. 513 00:32:16,110 --> 00:32:19,370 Што се случува во оваа слика кога ќе се јавам слободен? 514 00:32:19,370 --> 00:32:22,750 [Нечујни студент одговор] >> Ни. 515 00:32:22,750 --> 00:32:29,510 Ако јас го нарекувам бесплатно s и t - вид на трик прашање - оваа слика не се менува воопшто 516 00:32:29,510 --> 00:32:33,880 бидејќи повикувајќи ги и повикувајќи т само му кажува на оперативниот систем, 517 00:32:33,880 --> 00:32:39,010 еј, можете да го користите оваа меморија повторно, но тоа не се смени ова на нула 518 00:32:39,010 --> 00:32:41,840 или некои посебни карактер, тоа не го менува тоа, 519 00:32:41,840 --> 00:32:47,350 тоа не го менува h или на e или l или на l или о или во место за ништо друго. 520 00:32:47,350 --> 00:32:51,610 Во смисла на сликата, веднаш штом ќе се јавите бесплатно, ништо не се менува. 521 00:32:51,610 --> 00:32:56,570 И во него лежи потеклото на ѓубре вредности, бидејќи ако јас потоа подоцна во оваа програма 522 00:32:56,570 --> 00:33:01,010 побара од оперативниот систем за повеќе меморија со GetString или Примерок или нешто слично 523 00:33:01,010 --> 00:33:04,900 и на оперативниот систем, вели, сигурни, имам 12 бајти од меморија само се ослободува, 524 00:33:04,900 --> 00:33:08,080 ги користат овие, она што ви се случува да се предаде? 525 00:33:08,080 --> 00:33:10,830 Сте ќе биде предаден парче на меморија што ние обично ќе привлече 526 00:33:10,830 --> 00:33:13,700 со прашалници, но она што се оние прашалници? 527 00:33:13,700 --> 00:33:17,000 Тие се случи да биде ж-е-л-л-о, ж-е-л-л-о. 528 00:33:17,000 --> 00:33:20,940 Овие се нашите нови ѓубре вредности веднаш штом ќе се ослободи дека меморијата. 529 00:33:20,940 --> 00:33:22,750 >> Има импликација на реалниот свет тука. 530 00:33:22,750 --> 00:33:24,720 Ова се случува да се направи со RAM меморија, но вашите компјутери 531 00:33:24,720 --> 00:33:26,720 всушност го прават истото со диск. 532 00:33:26,720 --> 00:33:30,620 Ќе зборуваме за тоа особено во иднина проблем сет кој се фокусира на науки. 533 00:33:30,620 --> 00:33:36,170 Но, она што всушност се случува ако имате некои чувствителни финансиски датотека на вашиот десктоп 534 00:33:36,170 --> 00:33:39,600 или некои површни JPEG и ќе го повлечете во вашиот ѓубре, 535 00:33:39,600 --> 00:33:44,390 што се случува кога ќе се повлечете во ѓубрето или во ѓубрето? 536 00:33:44,390 --> 00:33:47,240 Ти знаеше дека она што јас го зборувам. [Смеа] 537 00:33:47,240 --> 00:33:52,370 Што се случува кога сте вовлечени дека доказите во вашиот ѓубрето или корпата за ѓубре? 538 00:33:52,370 --> 00:33:55,920 [Нечујни студент одговор] 539 00:33:55,920 --> 00:33:58,000 Па, толку внимателни. Што се случува кога ќе го направите тоа? 540 00:33:58,000 --> 00:34:01,030 На кратко одговорот е ништо, нели? 541 00:34:01,030 --> 00:34:04,790 Површни или чувствителни датотеки се уште само седи таму некаде на вашиот хард диск. 542 00:34:04,790 --> 00:34:07,940 Повеќето од нас барем научиле на потешкиот начин дека треба да го испразните ѓубрето 543 00:34:07,940 --> 00:34:10,429 или вашиот Recycle Bin да всушност избришете фајлови. 544 00:34:10,429 --> 00:34:13,440 И навистина, кога ќе десен клик или контрола клик на вашиот корпата за ѓубре 545 00:34:13,440 --> 00:34:15,580 или изберете Датотека, празни ѓубрето или што 546 00:34:15,580 --> 00:34:21,420 и ти всушност го испразните корпата за ѓубре или ѓубрето, што всушност се случува потоа оваа слика? 547 00:34:22,810 --> 00:34:25,969 Повеќе ништо. Така всушност ништо не се случува на дискот. 548 00:34:25,969 --> 00:34:30,880 >> И ако ние само привремено отплесвам и пишуваат - I'll само користење на задниот дел од ова. 549 00:34:30,880 --> 00:34:34,639 Па сега приказната се менува RAM меморија, која е местото каде програми постојат 550 00:34:34,639 --> 00:34:39,250 додека си ги трчање, на дискот, кој е местото каде што се чуваат долгорочна 551 00:34:39,250 --> 00:34:42,920 дури и кога моќта излегува, за сега - а ние ќе се вратам на ова во иднина - 552 00:34:42,920 --> 00:34:46,380 ајде да се преправаме дека ова претставува хард диск во внатрешноста на вашиот компјутер 553 00:34:46,380 --> 00:34:50,110 бидејќи во тоа време тие се користат да биде кружни дискови, слично како флопи дискови. 554 00:34:50,110 --> 00:34:55,130 Значи, ако имате некои чувствителни Excel датотеката, тоа би можело да потрае до овој дел од меморијата 555 00:34:55,130 --> 00:34:59,770 на дискот на вашиот компјутер, а јас сум само цртање исто произволни 1S и 0-ти. 556 00:34:59,770 --> 00:35:03,970 Кога ќе повлечете датотека како тоа да го ѓубрето или да Recycle Bin, 557 00:35:03,970 --> 00:35:07,750 буквално ништо не се случува, бидејќи Apple и Microsoft имаат само одлучи 558 00:35:07,750 --> 00:35:10,450 корпата за ѓубре и ѓубрето е навистина само привремени случаеви. 559 00:35:10,450 --> 00:35:14,710 Можеби на крајот на оперативниот систем ќе го испразните за вас, но обично, таа не прави ништо, 560 00:35:14,710 --> 00:35:17,090 барем додека сте навистина ниско на простор. 561 00:35:17,090 --> 00:35:20,870 >> Сепак, кога ќе отидете на празни ѓубрето или празни ѓубрето, 562 00:35:20,870 --> 00:35:23,460 Слично на тоа, ништо не се случува да се оваа слика. 563 00:35:23,460 --> 00:35:28,590 Сите што се случува е на друго место на вашиот компјутер, тука е некој вид на табела. 564 00:35:28,590 --> 00:35:35,400 Тоа е вид на како мала измамник лист кој се вели дека, да речеме, resume.doc, 565 00:35:35,400 --> 00:35:40,920 па вашата биографија во Мајкрософт Ворд користат да се живее на локацијата 123 на вашиот хард диск, 566 00:35:40,920 --> 00:35:43,710 не е во меморија, а не во RAM меморија, но на вашиот хард диск, 567 00:35:43,710 --> 00:35:49,050 и вашиот површни JPEG животи во 456, и вашиот Excel датотеката живее во 789 или каде. 568 00:35:49,050 --> 00:35:53,640 Кога ќе ги избришете фајлови од всушност празнење на ѓубрето или во ѓубрето, 569 00:35:53,640 --> 00:35:59,530 оваа слика не се менува. На 0-ти и 1S на вашиот хард диск не оди никаде. 570 00:35:59,530 --> 00:36:03,930 Но, оваа табела, оваа мала база на сорти, се менува. 571 00:36:03,930 --> 00:36:08,750 Кога ќе ги избришете вашата биографија, тоа е како да на датотеката е избришан во извесна смисла, 572 00:36:08,750 --> 00:36:12,790 но сите компјутер не е заборавите каде што нешто живее на вашиот хард диск. 573 00:36:12,790 --> 00:36:17,870 На 0-ти и 1S кои ја сочинуваат вашата биографија или било кој од овие други датотеки се уште недопрени. 574 00:36:17,870 --> 00:36:21,960 >> Значи, ако го направи тоа случајно, има уште не-нулта веројатност 575 00:36:21,960 --> 00:36:25,800 дека можете да закрепне вашите податоци користење Norton Utilities или некој комерцијален софтвер 576 00:36:25,800 --> 00:36:29,810 чија цел во животот е да се најде 0-ти и 1S кои се вид на е сираче, 577 00:36:29,810 --> 00:36:33,300 заборавени тука, но остави тука, така што можете да добиете на вашите податоци назад. 578 00:36:33,300 --> 00:36:38,410 Или форензичар иследниците со полицијата или на ФБИ всушност ќе се хард диск 579 00:36:38,410 --> 00:36:42,550 и всушност барате модели на 0-ти и 1S кои личат на JPEG слики, изгледа како Excel фајлови, 580 00:36:42,550 --> 00:36:46,400 и ги врати на тој начин, дури и ако компјутерот ги заборавил таму. 581 00:36:46,400 --> 00:36:49,820 Значи единствен начин навистина да ги избришете податоците, како ние ќе разговараме во иднина, 582 00:36:49,820 --> 00:36:54,190 е да мелез или избришете ја датотеката или хард диск со - 583 00:36:54,190 --> 00:36:56,540 Вие навистина не може да се ослободи од 0-ти и 1S 584 00:36:56,540 --> 00:36:59,440 затоа што во спротивно ќе почне со GIGABYTE хард диск 585 00:36:59,440 --> 00:37:02,380 и сакате да се заокружи со една мегабајти хард диск, ако постојано се бришење, 586 00:37:02,380 --> 00:37:04,380 буквално, 0-ти и 1S. 587 00:37:04,380 --> 00:37:06,310 Така што ќе направиш ако навистина сакаше да ги покрие вашите песни 588 00:37:06,310 --> 00:37:10,510 и основниот проблем е во тоа што има уште 0-ти и 1S на дискот? 589 00:37:10,510 --> 00:37:14,930 Гледам некој gesticulating дека физички ќе се скрши на уредот. Дека ќе работат. 590 00:37:14,930 --> 00:37:19,600 [Смеа] Но, ако тоа е вид на скапо решение, што ќе биде повеќе разумни? 591 00:37:19,600 --> 00:37:23,270 Да. >> [Студент] Запиши нив. >> Нив Запиши со што? >> [Студент] Други податоци. 592 00:37:23,270 --> 00:37:29,070 Други податоци. Вие само може да го изгубите Вашиот диск со 0-ти или 1s или сите 0-ти, сите 1S. 593 00:37:29,070 --> 00:37:31,230 >> И тоа е навистина она што некои од софтвер го прави тоа. 594 00:37:31,230 --> 00:37:33,570 Можете да ги купите софтвер или дури и да добие слободен софтвер, 595 00:37:33,570 --> 00:37:36,610 па дури и изградена во Mac OS овие денови, помалку во Windows, 596 00:37:36,610 --> 00:37:38,660 е способноста да се безбедно избрише. 597 00:37:38,660 --> 00:37:41,960 Всушност, ако сакате да сите работи дома денес ако имате Mac и го направите ова, 598 00:37:41,960 --> 00:37:45,740 ако имаш некои нешта во вашиот ѓубре може, можете да направите безбедна Празна ѓубрето, 599 00:37:45,740 --> 00:37:47,610 што го прави токму тоа. 600 00:37:47,610 --> 00:37:53,350 Наместо само избрише датотеките тука, тоа не се избрише 0-ти и 1S тука, 601 00:37:53,350 --> 00:38:01,240 напротив, тоа само ја менува сите нив, на пример, да 0-ти и точка, точка, точка. 602 00:38:01,240 --> 00:38:05,330 Значи една од вашите идни psets всушност, ќе биде намерно да поврати податоци - 603 00:38:05,330 --> 00:38:08,430 Фотографиите дека ние сме направени од луѓе, места и нешта на кампусот 604 00:38:08,430 --> 00:38:12,810 за кои ние ќе се направи форензички сликата на мемориската картичка дигитална камера, 605 00:38:12,810 --> 00:38:17,120 која е иста идеја - и ќе мора да се соочат со предизвикот да всушност најдете 606 00:38:17,120 --> 00:38:20,160 на моделите кои ги претставуваат JPEG слики на вашиот хард диск, 607 00:38:20,160 --> 00:38:23,610 многу сличен на оној поранешен студент чија е-мејл читав пред неколку недели не 608 00:38:23,610 --> 00:38:25,860 за враќање на фотографии на сестра си. 609 00:38:25,860 --> 00:38:30,300 Зошто не можеме да ги 5-минутна пауза тука, а ние ќе се регрупираат со повеќе меморија. 610 00:38:33,030 --> 00:38:38,610 Значи тука е местото каде што нештата се малку ум-свиткување, но ова е многу моќен чекор 611 00:38:38,610 --> 00:38:40,480 кон разбирањето на ова сè повеќе и повеќе. 612 00:38:40,480 --> 00:38:42,900 Тука е програма наречена pointers.c. 613 00:38:42,900 --> 00:38:45,430 Тоа е меѓу мостра кодот денес. 614 00:38:45,430 --> 00:38:51,280 Забележете дека во првите неколку линии, 19 преку 22, сите ние сме прави е нешто како GetString 615 00:38:51,280 --> 00:38:54,460 и враќање на адреса, складирање на тоа во с. 616 00:38:54,460 --> 00:38:58,380 Отсега за pset дури и 3 ако сакате, но pset 4 и на 617 00:38:58,380 --> 00:39:01,030 каде што може да почнат да ги преземат овие обука тркала исклучи себе, 618 00:39:01,030 --> 00:39:04,030 не постои причина да се преправаме дека стрингови постои повеќе. 619 00:39:04,030 --> 00:39:07,030 Тоа е сигурно во ред само да почнеме да ја кажуваме char *. 620 00:39:07,030 --> 00:39:12,610 >> Како настрана, во онлајн референци и во книгите често може да се види ѕвезда до променливата. 621 00:39:12,610 --> 00:39:15,600 Можете дури и може да се види простори околу двете страни на него. 622 00:39:15,600 --> 00:39:17,680 Сите тие се функционално точни. 623 00:39:17,680 --> 00:39:21,180 За сега, сепак, ќе се стандардизираат на овој приод да се направи супер јасен 624 00:39:21,180 --> 00:39:24,000 дека char * е како да кажеш карактер покажувачот. 625 00:39:24,000 --> 00:39:25,680 Тоа е тип на податок. 626 00:39:25,680 --> 00:39:28,730 И тогаш името на променливата е и во овој случај. 627 00:39:28,730 --> 00:39:31,180 Значи ние сме добиле стринг и ние го нарече s. 628 00:39:31,180 --> 00:39:35,180 А потоа надолу тука забележите дека јас го правам, всушност, малку на измама. 629 00:39:35,180 --> 00:39:39,080 Ова се нарекува покажувачот аритметика, која е вид на супер едноставен. 630 00:39:39,080 --> 00:39:41,790 Тоа само значи додаде и одземе броеви на покажувачи. 631 00:39:41,790 --> 00:39:43,660 Но, ова всушност работи. 632 00:39:43,660 --> 00:39:49,170 Оваа програма очигледно отпечатоци 1 карактер на стрингот е по линија, така што крајниот резултат - 633 00:39:49,170 --> 00:39:54,920 Само така можеме да ги расипат кога тоа се случува, бидете совети, работи совети, дозволете ми да зумирате внатре 634 00:39:54,920 --> 00:39:58,940 Сега дозволете ми да напишете нешто како ЗДРАВО и видот Влези 635 00:39:58,940 --> 00:40:01,080 и тоа отпечатоци 1 карактери во линија. 636 00:40:01,080 --> 00:40:04,730 До втор пред, ние би го направиле тоа со квадратни загради нотација. 637 00:40:04,730 --> 00:40:09,760 Би имале за телефонска линија и ние ќе го стори printf на е [i] и ние ќе го стори тоа повторно и повторно и повторно 638 00:40:09,760 --> 00:40:11,950 со обратна коса црта n на крајот на секој ред. 639 00:40:11,950 --> 00:40:16,800 Но оваа програма е поинаква. Оваа програма е користење, буквално, аритметика. 640 00:40:16,800 --> 00:40:18,860 Значи она што се случува овде? 641 00:40:18,860 --> 00:40:24,720 Прво на сите, пред овој циклус дури извршува, што, само за да биде јасно, е е всушност? 642 00:40:24,720 --> 00:40:27,270 S е? >> [Студент] Еден адреса. >> Адреса. 643 00:40:27,270 --> 00:40:32,980 >> И тоа е адресата на, во случај на здраво, првиот карактер во тој збор, која е часот. 644 00:40:32,980 --> 00:40:37,370 Така и е, во овој конкретен пример, адреса на час. 645 00:40:37,370 --> 00:40:41,850 Значи она што значи тоа да ги направи + i? 646 00:40:41,850 --> 00:40:46,280 Па, јас започнува од 0 во овој за телефонска линија. Ние го направивме тоа многу пати. 647 00:40:46,280 --> 00:40:49,760 Јас се случува да одам до должината на стрингот, очигледно. 648 00:40:49,760 --> 00:40:53,950 Така, на првата итерација на овој циклус, јас очигледно е 0. 649 00:40:53,950 --> 00:41:01,740 Значи овој израз е велејќи дека е + i - напротив, ги +0--тоа е очигледно само s. 650 00:41:01,740 --> 00:41:04,320 Значи она што е * е тука? 651 00:41:04,320 --> 00:41:08,530 Сега ние сме со користење на ѕвезда во малку поинаков начин. 652 00:41:08,530 --> 00:41:13,080 Дозволете ми да оди напред и да се ослободи од т затоа што ние сме направиле зборуваме за т и копии од е. 653 00:41:13,080 --> 00:41:15,540 Сега ние само сакаме да се раскаже приказна, вклучувајќи ги. 654 00:41:15,540 --> 00:41:20,090 И така во овој момент, откако типот стринг, нашиот свет изгледа доста како тоа го правеше пред 655 00:41:20,090 --> 00:41:26,630 со само на чување на адресата на час и поопшто посочувајќи на низа здраво. 656 00:41:26,630 --> 00:41:33,170 Ако јас сега се направи една линија како * (а + i), да се обидат ова. 657 00:41:33,170 --> 00:41:40,140 Значи * (а + i). Дозволете ми да се поедностави ова, бидејќи ова е 0, така што ова е * (и 0). 658 00:41:40,140 --> 00:41:43,790 Па, почекајте една минута. Поедноставување понатаму. Ова е * (а). 659 00:41:43,790 --> 00:41:47,020 Па, сега заградите се вид на глупави, па сега ајде да направите * s. 660 00:41:47,020 --> 00:41:50,540 Значи во првата итерација на овој циклус, таа линија која е обележано, 26, 661 00:41:50,540 --> 00:41:53,650 е доста еднакво на печатење ова. 662 00:41:53,650 --> 00:41:56,040 Што е податоци за видот на * а? 663 00:41:56,040 --> 00:42:00,770 Во овој контекст, бидејќи ѕвездата се случува да биде до Кликнете себе, 664 00:42:00,770 --> 00:42:04,930 но поконкретно, затоа што ние веќе не се наведува с, 665 00:42:04,930 --> 00:42:09,730 ние не сме создавање на променлива повеќе, нема спомнување на char * во линија 26, 666 00:42:09,730 --> 00:42:14,280 нема споменување на клучни зборови стринг, ние сме само со користење на променлива наречена с, 667 00:42:14,280 --> 00:42:19,650 излегува сега е ѕвезда има малку поинаков и, очигледно, збунувачки значење. 668 00:42:19,650 --> 00:42:26,590 * Кликнете тука значи одат на адреса на и печатење на она што е таму. 669 00:42:26,590 --> 00:42:33,750 Значи s е тука, * s е - вид како Улеи и скали, следете ги стрелките - тука. 670 00:42:33,750 --> 00:42:35,850 Значи ова е * е. 671 00:42:35,850 --> 00:42:39,060 >> Значи она што добива отпечатена на првата итерација на тој циклус во согласност 26? 672 00:42:39,060 --> 00:42:42,170 Јас испечатите% c, која е застапник за лик, 673 00:42:42,170 --> 00:42:48,520 тогаш \ n за нов ред. * (А + i) каде што е 0 е само тоа. 674 00:42:48,520 --> 00:42:53,670 Значи она знак можам да се одржи во за% c? Х 675 00:42:53,670 --> 00:42:56,900 Во следниот повторување на јамка - што веројатно може да се види таму каде што тоа се случува - 676 00:42:56,900 --> 00:43:01,350 следниот повторување i е очигледно 1, па ова значи е 1, 677 00:43:01,350 --> 00:43:05,580 и тогаш сега јас треба на загради бидејќи сега е ѕвезда треба да се каже 678 00:43:05,580 --> 00:43:08,620 одат на мемориската адреса на 1. 679 00:43:08,620 --> 00:43:14,170 Што е е? Ајде да се тркалаат назад во времето и велат дека ова стрелка сега не е, всушност, ни прават какви било услуги. 680 00:43:14,170 --> 00:43:18,450 Да поточно да се каже дека ова е чување на бројот 123 681 00:43:18,450 --> 00:43:25,110 бидејќи на почетокот на овој стринг Здраво, ова е адресата 123, ова е 124, и така натаму. 682 00:43:25,110 --> 00:43:30,550 Така, на втората итерација кога сакам да кажам дека е 1, тоа е како да кажеш 123 1, 683 00:43:30,550 --> 00:43:35,340 инаку позната како 124, така што char добива печатено на втората итерација? 684 00:43:35,340 --> 00:43:37,850 Е на мемориската адреса 124. 685 00:43:37,850 --> 00:43:44,440 Потоа + повторно, 125, 126, 127, и овој циклус за среќа престане пред да го добие тука 686 00:43:44,440 --> 00:43:49,040 бидејќи јас сум со користење strlen да бидете сигурни дека јас не се брои премногу висока. 687 00:43:49,040 --> 00:43:50,810 Па и тоа е тоа. 688 00:43:50,810 --> 00:43:55,000 Повторно, ова е исто како да сме го направиле пред една недела. 689 00:43:55,000 --> 00:43:59,200 Дозволете ми да го напишете на линија подолу иако ние не сакаме да ги работам и двете. 690 00:43:59,200 --> 00:44:02,500 Ова е идентична сега на ова. 691 00:44:02,500 --> 00:44:08,310 >> Значи иако е е стринг, како ние сме биле нарекувајќи за неколку недели, а е навистина char *. 692 00:44:08,310 --> 00:44:13,270 Значи, ако сакаме да бидеме супер анален, тоа е навистина правилно да се напише специфичниот карактер 693 00:44:13,270 --> 00:44:17,490 на ith локација со користење на овие нумерички адреси и оваа ѕвезда оператор, 694 00:44:17,490 --> 00:44:20,470 но искрено, тоа е толку многу почист. Значи ова не е лошо. 695 00:44:20,470 --> 00:44:26,720 Нема причина да престане да прави линија 27 тука, но 26 е функционално иста, 696 00:44:26,720 --> 00:44:31,570 и тоа е функционално исто токму за причините што ние сме дискутирање досега. 697 00:44:31,570 --> 00:44:33,650 И на крај, 29 е само добра пракса. 698 00:44:33,650 --> 00:44:38,420 Повикувајќи без Кликнете значи дека сега си даваат назад меморија која GetString ви даде 699 00:44:38,420 --> 00:44:41,630 бидејќи повторно, како што споменав Понеделник, GetString недели 700 00:44:41,630 --> 00:44:44,180 е воведување на бубачка во вашиот код. 701 00:44:44,180 --> 00:44:46,490 Твојот код за неколку недели имаше меморија протекување 702 00:44:46,490 --> 00:44:49,970 при што баравте GetString за меморија, но никогаш не сум бил давајќи назад. 703 00:44:49,970 --> 00:44:53,410 И тоа беше намерно избран од нас педагогичен 704 00:44:53,410 --> 00:44:55,880 бидејќи тоа е само премногу да размислува за рано. 705 00:44:55,880 --> 00:44:57,710 Но, сега ни треба повеќе симетрија. 706 00:44:57,710 --> 00:45:00,830 Ако побарате компјутер за меморија, како што е случај за GetString, 707 00:45:00,830 --> 00:45:02,820 како што е случај очигледно за Примерок, 708 00:45:02,820 --> 00:45:07,970 мора да сега за pset 4 наваму исто така бесплатно секоја таква меморија. 709 00:45:07,970 --> 00:45:11,650 Забележите ова е различно од велејќи int n. 710 00:45:11,650 --> 00:45:15,040 Вие не треба да се ослободи ова затоа што не си се јавите GetString 711 00:45:15,040 --> 00:45:16,890 и не се јавите Примерок. 712 00:45:16,890 --> 00:45:20,610 >> Па дури и ако се нарекува GetInt како што ние на крајот ќе видиме, 713 00:45:20,610 --> 00:45:25,520 GetInt не алоцира меморија за вас, бидејќи вие всушност може да помине околу броеви 714 00:45:25,520 --> 00:45:29,430 и плови и карактери само начинот на кој ние се прави за неколку недели. 715 00:45:29,430 --> 00:45:33,960 Жици, сепак, се специјални бидејќи навистина тие се сплет на повеќе карактери. 716 00:45:33,960 --> 00:45:37,450 Значи тие се само различни од знаци и плови и ints и слично. 717 00:45:37,450 --> 00:45:39,980 Но ние ќе се вратам на тоа пред долго. 718 00:45:39,980 --> 00:45:44,920 Било какви прашања тогаш на почетокот на покажувачи? Да. 719 00:45:44,920 --> 00:45:49,690 [Нечујни студент Прашање] 720 00:45:49,690 --> 00:45:51,440 Ах, многу добро прашање. 721 00:45:51,440 --> 00:45:55,790 Еден од ретките нешта Ц всушност прави за вас, што е погодно, 722 00:45:55,790 --> 00:46:00,110 е тоа, фигурира за вас што големина е од тип на податоци 723 00:46:00,110 --> 00:46:03,060 а потоа прави тој вид на множење за вас. 724 00:46:03,060 --> 00:46:06,610 Тоа е неважно во случај на карактери, бидејќи скоро секогаш знак е 1 бајт, 725 00:46:06,610 --> 00:46:08,150 па ова едноставно работи. 726 00:46:08,150 --> 00:46:11,220 Но за доброто на дискусија, ако сте биле всушност печатење цели броеви 727 00:46:11,220 --> 00:46:15,500 и ќе се обидуваат да се печати некои вредност на кои се укажува во цел број, 728 00:46:15,500 --> 00:46:20,720 можете слично не би треба да направите + 4 * Јас само затоа што int е 4 бајти. 729 00:46:20,720 --> 00:46:25,780 Покажувачот аритметички значи дека C и компајлерот направи сето она што математика за вас. 730 00:46:25,780 --> 00:46:29,190 Се што треба да се грижи за е пребројување во вид на човечка свест. Да. 731 00:46:29,190 --> 00:46:35,200 [Студент] Ако се изјасни за низа внатре за телефонска линија, не мора да го ослободи подоцна? 732 00:46:35,200 --> 00:46:36,760 Добро прашање. 733 00:46:36,760 --> 00:46:41,390 >> Ако прогласи низа внатрешноста на за телефонска линија, не ви треба за да се ослободи подоцна? 734 00:46:41,390 --> 00:46:47,520 Вие само треба да ослободите меморија што ќе одвои со GetString или со Примерок. 735 00:46:47,520 --> 00:46:53,110 Значи, ако речеме нешто како - дозволете ми да се стави големи загради, па сега сите го кодот е поврзана. 736 00:46:53,110 --> 00:46:58,580 Ако сте направиле нешто, иако buggily, како оваа, char * t = с, 737 00:46:58,580 --> 00:47:03,450 не треба да се ослободи т бидејќи т не се однесуваат на било споменување на Примерок или GetString. 738 00:47:03,450 --> 00:47:08,960 Ако пак сте направиле ова, GetString, тогаш да, ќе треба да се слободно т. 739 00:47:08,960 --> 00:47:14,350 И всушност, вашата единствена шанса да се направи тоа е сега во овој циклус, за истото прашање од делокругот 740 00:47:14,350 --> 00:47:16,060 дека ние сме се дискутира во минатото. 741 00:47:16,060 --> 00:47:18,830 Инаку ќе бидете доделување меморија, доделување меморија, доделување меморија, 742 00:47:18,830 --> 00:47:21,230 и на крајот на програмата, бидејќи ти си надвор од тоа јамка, 743 00:47:21,230 --> 00:47:24,240 т не постои, но никогаш не кажа на оперативниот систем 744 00:47:24,240 --> 00:47:26,750 дека не треба тоа сеќавање повеќе. 745 00:47:26,750 --> 00:47:30,430 И пред долго време, за pset 4 или 5 ќе ви овозможат со програма наречена Valgrind, 746 00:47:30,430 --> 00:47:34,160 која е слични во духот со GDB по тоа што доби нешто на arcane интерфејс, 747 00:47:34,160 --> 00:47:35,750 но неговата цел во животот е да ви помогнеме. 748 00:47:35,750 --> 00:47:39,380 И Valgrind е програма со која во иднина ќе пребарување вашите програми 749 00:47:39,380 --> 00:47:42,550 барате меморија протекување, без разлика дали од GetString или Примерок, 750 00:47:42,550 --> 00:47:47,800 кои ќе почнат да го користат сè повеќе и повеќе како што престане со користење на CS50 библиотека толку многу. 751 00:47:47,800 --> 00:47:53,030 Ние конечно сега имаат вид на речник и вид на ментална модел во теорија 752 00:47:53,030 --> 00:47:55,170 со која треба да се реши овој скршени програма. 753 00:47:55,170 --> 00:47:59,410 >> Така што во овој скршени програма, swap работи во внатрешноста на swap, 754 00:47:59,410 --> 00:48:05,280 но никогаш всушност работел во главниот бидејќи главните донесен во x и y, отповикување, 755 00:48:05,280 --> 00:48:07,260 и оние кои беа донесени од страна вредности, така да се каже. 756 00:48:07,260 --> 00:48:09,330 Копии од нив беа дадени да се разменуваат. 757 00:48:09,330 --> 00:48:12,520 До крајот на swap, a и b се навистина биле разменети, 758 00:48:12,520 --> 00:48:16,120 но се разбира x и y, како што се дискутира во понеделникот, не биле. 759 00:48:16,120 --> 00:48:19,940 Па јас предлагам во зелено тука дека ова е всушност решение тука. 760 00:48:19,940 --> 00:48:22,640 И всушност, дозволете ми да се движи мојот ѕвезди само за да бидат во согласност 761 00:48:22,640 --> 00:48:24,440 иако, повторно, функционално, тоа не е важно. 762 00:48:24,440 --> 00:48:28,730 Во иднина недели ќе објасни кога и зошто тоа не е важно. 763 00:48:28,730 --> 00:48:30,600 Значи во зелена сега е решение. 764 00:48:30,600 --> 00:48:33,700 Искрено, тоа изгледа во целина многу Messier бидејќи имам сите овие ѕвезди. 765 00:48:33,700 --> 00:48:35,380 Дозволете ми да истакнам една работа. 766 00:48:35,380 --> 00:48:40,040 Горниот ред тука, каде што вели int * а и int * b 767 00:48:40,040 --> 00:48:42,820 е фундаментално го прават истото како што секогаш има. 768 00:48:42,820 --> 00:48:47,070 Тоа е прогласување 2 аргументи или параметри да се разменуваат, 769 00:48:47,070 --> 00:48:49,940 од кои првата е int покажувачот нарекува, 770 00:48:49,940 --> 00:48:53,100 Вториот од кои е int покажувач кој се нарекува б. 771 00:48:53,100 --> 00:48:55,770 Единственото нешто што е ново во овој момент е фактот дека има ѕвезда таму. 772 00:48:55,770 --> 00:48:59,340 >> Што значи тоа? А не е int, б не е int. 773 00:48:59,340 --> 00:49:04,100 А е адресата на int и б е адресата на различни int. 774 00:49:04,100 --> 00:49:06,980 Овде, ова е местото каде што јас си признаам C добива збунувачки. 775 00:49:06,980 --> 00:49:09,790 Сега ние сме со користење на ѕвезда, но има различно значење во овој контекст. 776 00:49:09,790 --> 00:49:13,150 Бидејќи ние не сме прогласување совети како ние сме се тука, 777 00:49:13,150 --> 00:49:15,500 тука сме dereferencing работи. 778 00:49:15,500 --> 00:49:21,520 Значи технички, ѕвездата во овој контекст на првата, втората и третата линија во внатрешноста на swap 779 00:49:21,520 --> 00:49:24,560 е Dereference оператор, кој едноставно значи одиме таму. 780 00:49:24,560 --> 00:49:27,400 Па само како прст следи на стрелката за да часот, 781 00:49:27,400 --> 00:49:31,100 * Средство одат на таа адреса и ме најде int дека е таму. 782 00:49:31,100 --> 00:49:34,250 * Б средства одат на адресата и помине мене она што е таму. 783 00:49:34,250 --> 00:49:40,730 Значи, да ја прецрта на сликата од понеделник сега се користи магацинот на рамки, 784 00:49:40,730 --> 00:49:43,130 на дното од кои една ќе биде главен, 785 00:49:43,130 --> 00:49:47,600 горниот еден од нив ќе биде swap, 786 00:49:47,600 --> 00:49:50,880 така што нашиот свет изгледа, исто како и во понеделникот, како оваа. 787 00:49:50,880 --> 00:49:53,620 Еве парче меморија која главни се случува да го користите. 788 00:49:53,620 --> 00:49:56,520 >> Потсетиме од понеделник дека програмата само имаше 2 променливи, 789 00:49:56,520 --> 00:50:01,930 еден вика x и еден вика y, и јас го стави на броеви 1 и 2 не. 790 00:50:01,930 --> 00:50:06,580 Сега кога ќе се јавам разменуваат како што го направив во понеделникот, 791 00:50:06,580 --> 00:50:11,000 претходно кога јас се користи црвена верзија на оваа програма, која изгледа вака, 792 00:50:11,000 --> 00:50:17,470 Добив параметри 2, a и b, и она што го пишуваме тука и тука? 793 00:50:17,470 --> 00:50:21,160 Само 1 и 2, буквално копии на x и y. 794 00:50:21,160 --> 00:50:23,070 Денес ние го промени тоа. 795 00:50:23,070 --> 00:50:28,510 Денес наместо да се донесува во ints a и b ние ќе помине во 2 адреси. 796 00:50:28,510 --> 00:50:34,290 Тие адреси се случи да се укаже ints, но тие адреси не се самите ints. 797 00:50:34,290 --> 00:50:37,330 Тие се адреси. Тоа е како поштенска адреса, наместо. 798 00:50:37,330 --> 00:50:40,580 Па сега ние треба само да си даде малку повеќе детали на екранот. 799 00:50:40,580 --> 00:50:43,250 Ова е меморија на компјутерот ми е како што беше целиот ден. 800 00:50:43,250 --> 00:50:45,120 Сега ние треба некои произволни броеви шема. 801 00:50:45,120 --> 00:50:50,580 Значи, да речеме, само со шанса, дека ова е мемориска адреса 123, 124. 802 00:50:50,580 --> 00:50:55,660 Да речеме ова е 125, ова е 126, и така натаму, но тоа е сосема произволна. 803 00:50:55,660 --> 00:50:58,590 Ние само треба некои нумерирање шема во моето сеќавање. 804 00:50:58,590 --> 00:51:04,030 Па сега кога јас всушност помине во x и y, јас не одам да се помине во x и y; 805 00:51:04,030 --> 00:51:08,400 Одам да помине во поштенска адреса, така да се каже, на x и y 806 00:51:08,400 --> 00:51:11,870 така што она што добива чуваат тука и тука не е 1 и 2, 807 00:51:11,870 --> 00:51:16,030 но ако може да се види мојот мал текст, што ќе поминуваат тука и тука? 808 00:51:16,030 --> 00:51:23,340 [Нечујни студент одговор] >> Токму така. 123 добива стави тука и 124 добива стави тука. 809 00:51:23,340 --> 00:51:28,910 >> Сега, бидејќи јас се користи на ѕвезда во оваа многу првата линија пат до тука во врвот, 810 00:51:28,910 --> 00:51:34,340 мојата програма е само знае дека 123 и 124, иако тие се очигледно броеви 811 00:51:34,340 --> 00:51:40,160 дека секој човек може да забележите, тие треба да се толкува како адреси, нумерички адреси. 812 00:51:40,160 --> 00:51:43,250 Тие не се сами по себе ints, тие се адреси, 813 00:51:43,250 --> 00:51:46,120 а тоа е затоа што сум експлицитно стави ѕвезди таму. 814 00:51:46,120 --> 00:51:51,360 Па сега во мојот прв, втор и трет линија на реалните код она што се случува тука? 815 00:51:51,360 --> 00:51:53,380 Да се ​​подготви остатокот од сликата. 816 00:51:53,380 --> 00:51:56,980 Tmp е исто како што беше во понеделникот. Ништо посебно за мали. 817 00:51:56,980 --> 00:52:03,060 Тоа е само локално 32 бита променлива, и внатре во тоа јас сум очигледно чување на вредноста на * a. 818 00:52:03,060 --> 00:52:08,580 Сега, ако јас само рече tmp = a, она што јас ќе ја стави овде? >> [Студент] 123. 819 00:52:08,580 --> 00:52:10,370 123. Но, тоа не е она што јас го правам. 820 00:52:10,370 --> 00:52:13,670 Сакам да кажам дека tmp = * a. Ѕвезда средства одат таму. 821 00:52:13,670 --> 00:52:19,370 Па овде е, 123. Како можам да одам таму? Преправам како има стрела. 822 00:52:19,370 --> 00:52:24,460 Па, таму е, 1. Значи она што добива чуваат во мали, очигледно? Само 1. 823 00:52:24,460 --> 00:52:29,620 Значи со други зборови, мали е * а, * средство одат на адреса која во моментов е во, 824 00:52:29,620 --> 00:52:31,320 што е очигледно 123. 825 00:52:31,320 --> 00:52:33,910 >> Океј, тука сме на локација 123, гледам број 1, 826 00:52:33,910 --> 00:52:35,670 па ќе одам да се стави број 1 таму. 827 00:52:35,670 --> 00:52:39,020 Сега што да правам во алинеја 2, * a = * б? 828 00:52:39,020 --> 00:52:44,570 Ова е малку повеќе вклучени, бидејќи сега што е? Тоа е 123. 829 00:52:44,570 --> 00:52:50,220 Значи * a е каде? Таму каде што беше пред. Па оди таму. Во ред. 830 00:52:50,220 --> 00:52:53,420 Сега, на крај, а потоа конечно ова ќе почне да се направи смисла, се надевам, 831 00:52:53,420 --> 00:53:00,280 * Б значи она што е во Б? 124. Па јас треба да одам таму, што е 2. 832 00:53:00,280 --> 00:53:03,430 Значи она што можам да се стави каде? 833 00:53:03,430 --> 00:53:10,100 2 оди во тука, бидејќи * б оди во * a. Па јас ќе го направи тоа. 834 00:53:10,100 --> 00:53:13,120 И веќе може да се види, можеби, дека ние сме толку многу поблиску 835 00:53:13,120 --> 00:53:17,710 за решавање на овој глупав, едноставен проблем правилно, за прв пат 836 00:53:17,710 --> 00:53:20,920 бидејќи сега имаме уште сеќавање на она што x е, 837 00:53:20,920 --> 00:53:23,230 имаме 2 копии, очигледно, на y, 838 00:53:23,230 --> 00:53:25,850 но алинеја 3 сега вели * b. 839 00:53:25,850 --> 00:53:31,080 Па овде е б. * Б средства одат таму. Значи, каде е место 124? 840 00:53:31,080 --> 00:53:35,560 Тоа е очигледно тука. Значи она што не го ставам овде? Очигледно, мали. 841 00:53:35,560 --> 00:53:39,600 Па сега јас го направите тоа. Значи имам 1 тука и 2 тука. 842 00:53:39,600 --> 00:53:43,560 И сега што за сето ова, на 123, 124 и 1? 843 00:53:43,560 --> 00:53:47,910 Штом swap враќа, оваа меморија е добра како изгубени 844 00:53:47,910 --> 00:53:51,070 бидејќи штом swap враќа, оперативниот систем 845 00:53:51,070 --> 00:53:54,190 е слободен да го користат меморија повторно во иднина. 846 00:53:54,190 --> 00:53:58,870 Само меморија главниот е на дното на оваа т.н. стек држи околу. 847 00:53:58,870 --> 00:54:01,470 >> И така ние конечно имаат сега работна верзија. 848 00:54:01,470 --> 00:54:06,310 Дозволете ми да одат во swap.c, и забележиме следниве. 849 00:54:06,310 --> 00:54:11,280 На врвот на програмата Се променив мојот прототип да биде int * а и int * b. 850 00:54:11,280 --> 00:54:15,000 Значи единственото нешто што се промени за да одат од црвена, која беше лошо, во зелена, што е добро, 851 00:54:15,000 --> 00:54:17,350 е Јас додадов овие ѕвезди денес. 852 00:54:17,350 --> 00:54:21,520 Но, тогаш тука долу во себе разменуваат морав да го копирате, паста што беше само на слајд. 853 00:54:21,520 --> 00:54:24,140 Имам ѕвезда тука, ѕвезда тука - тоа се совпаѓа со прототип - 854 00:54:24,140 --> 00:54:27,930 а потоа сите овие работи сега има ѕвезди, освен за мали 855 00:54:27,930 --> 00:54:30,680 бидејќи употребата на привремена променлива, нема ништо ново таму. 856 00:54:30,680 --> 00:54:33,040 Јас само треба привремено чување за Инт. 857 00:54:33,040 --> 00:54:34,820 Значи ние не треба ѕвезда таму. 858 00:54:34,820 --> 00:54:39,310 Ние само треба ѕвезда, така што можеме да премине овој вид на произволни граница 859 00:54:39,310 --> 00:54:42,900 помеѓу овие 2 рамки во меморијата на компјутерот ми е. 860 00:54:42,900 --> 00:54:45,630 Но, едно последно нешто мора да се промени, а вие може да го крие веќе. 861 00:54:45,630 --> 00:54:48,810 Што другата линија е очигледно различни сега? >> [Студент] и x. 862 00:54:48,810 --> 00:54:53,270 >> Да, па 25 е на последната линија на кодот што треба да се промени за ова да работи. 863 00:54:53,270 --> 00:54:58,360 Пред една недела, па дури и во понеделникот линија 25 изгледа вака, разменуваат x и y, 864 00:54:58,360 --> 00:55:02,020 и ова е само скршен бидејќи ако се каже swap (x, y) 865 00:55:02,020 --> 00:55:05,660 ќе се даваат копии на x и y да се разменуваат, тогаш таа го прави нејзината работа, 866 00:55:05,660 --> 00:55:09,080 но никогаш не сме всушност менување на x и y себе. 867 00:55:09,080 --> 00:55:12,880 Па дури и ако никогаш не сум видел ваков карактер пред со симболот во кодот, 868 00:55:12,880 --> 00:55:15,860 само да се погоди. Што значи симболот се направи, очигледно? 869 00:55:15,860 --> 00:55:17,890 [Студент] зема адреса. >> Зема адреса. 870 00:55:17,890 --> 00:55:21,160 Па симболот е велејќи ми даде адресата на x. 871 00:55:21,160 --> 00:55:25,590 Кој знае каде е тоа? Се случува да биде 123. Не ми е гајле. Само ми даде адресата на x. 872 00:55:25,590 --> 00:55:28,340 & Y значи ми даде адресата на y. 873 00:55:28,340 --> 00:55:34,450 И во тој момент на приказната е совршено се совпаѓа со сликата што ние привлече момент пред. 874 00:55:34,450 --> 00:55:38,310 >> Па јас ќе признаам покажувачи, сигурно за мене кога јас прв пат започна учење ова, 875 00:55:38,310 --> 00:55:40,570 беа дефинитивно една од најтешките работи кои треба да заврши мојот ум наоколу. 876 00:55:40,570 --> 00:55:43,760 Но сфати, особено затоа што ние ги играте со овие видови на нештата, 877 00:55:43,760 --> 00:55:48,030 ако го срушат овие супер едноставен вид на интелектуално неинтересен проблеми 878 00:55:48,030 --> 00:55:52,270 само се движат брои околу, одговорот на многу конфузија со покажувачи 879 00:55:52,270 --> 00:55:56,590 навистина може да се изведе од овие многу основни механика. 880 00:55:56,590 --> 00:55:59,070 Еве еден адреса. Оди таму со ѕвезда. 881 00:55:59,070 --> 00:56:03,830 Или обратно, тука е симболот. Дознаам што адресата навистина е. 882 00:56:03,830 --> 00:56:06,270 Во ред. 883 00:56:06,270 --> 00:56:09,000 Значи каде е сето ова меморија доаѓаат од? 884 00:56:09,000 --> 00:56:12,360 Ние сме подготвени оваа слика неколку пати, и јас ги ветува ние ќе се вратам на тоа, 885 00:56:12,360 --> 00:56:14,920 но тука е застапеноста на меморијата на вашиот компјутер 886 00:56:14,920 --> 00:56:17,420 тоа е малку повеќе означени од нашите таблата тука е. 887 00:56:17,420 --> 00:56:21,590 Текстот сегмент на врвот претставува она што во врска со вашата програма? 888 00:56:21,590 --> 00:56:26,090 [Нечујни студент одговор] >> Извини? Кажам уште еднаш. 889 00:56:26,090 --> 00:56:28,660 [Студент] Вистинските програма. >> Вистинските програма. 890 00:56:28,660 --> 00:56:32,430 >> Значи 0-ти и 1S дека сте собрани по пишување C код, а потоа работи ѕвекот 891 00:56:32,430 --> 00:56:35,910 и генерирање на 0-ти и 1S завршува добивање сместена таму во меморијата 892 00:56:35,910 --> 00:56:38,570 затоа што кога ќе кликнете два пати на иконата на вашиот Mac или PC 893 00:56:38,570 --> 00:56:43,010 или извршувате командата како Марио во вашата линија, твојот 0-ти и 1S од дискот 894 00:56:43,010 --> 00:56:45,700 се вчитани во меморија, така што компјутерот може да манипулира со нив 895 00:56:45,700 --> 00:56:47,540 и ги изврши побрзо. 896 00:56:47,540 --> 00:56:50,880 Значи иницијализира податоците и деиницијализира податоци, ние нема да зборуваме многу за оние, 897 00:56:50,880 --> 00:56:52,420 но тие се само глобални променливи. 898 00:56:52,420 --> 00:56:54,710 Иницијализиран значи глобални променливи што ви го дал вредности; 899 00:56:54,710 --> 00:56:59,300 деиницијализира значи глобални променливи кои се 'уште не даде вредности. 900 00:56:59,300 --> 00:57:01,900 Потоа, тука е овие животната средина променливи кои јас целосно ќе се бранува мојата рака, 901 00:57:01,900 --> 00:57:04,860 но тие се таму и дека продавници работи како вашето корисничко име 902 00:57:04,860 --> 00:57:08,090 и друг вид на пониско ниво детали. 903 00:57:08,090 --> 00:57:12,880 Но juiciest парчиња распоред вашата меморија е ова нешто наречено магацинот и грамада. 904 00:57:12,880 --> 00:57:17,470 Магацинот повторно, да биде јасно, е меморија што се користи секогаш кога функции се нарекуваат, 905 00:57:17,470 --> 00:57:19,710 секогаш кога постојат локални променливи 906 00:57:19,710 --> 00:57:22,120 и секогаш кога има се параметри кои се раздавани наоколу. 907 00:57:22,120 --> 00:57:24,490 Сето тоа се случува во оџак. 908 00:57:24,490 --> 00:57:29,570 Грамада не сме зборуваше, но претпоставете кој го користи грамада. 909 00:57:31,120 --> 00:57:32,690 Само различен дел од меморијата. 910 00:57:32,690 --> 00:57:36,620 Тоа се случува да се извлечат тука на врвот, но тоа е произволна сликовно конвенција. 911 00:57:36,620 --> 00:57:41,670 Кој очигледно бил со користење меморија од грамада за неколку недели? 912 00:57:41,670 --> 00:57:44,830 Тоа е технички вас, но индиректно. >> [Студент] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString и Примерок. Значи тука е фундаментална разлика. 914 00:57:47,950 --> 00:57:51,300 >> Знаете во изминатите неколку недели дека ако треба меморијата, само декларирате променлива. 915 00:57:51,300 --> 00:57:54,560 Ако ви треба многу меморија, објави низа право во внатрешноста на вашиот функција. 916 00:57:54,560 --> 00:57:59,620 Но, проблемот што го чуваат со кои се соочува е ако декларираат променливи локално внатрешноста на функции, 917 00:57:59,620 --> 00:58:05,340 штом функција се враќа, што се случува со меморијата и оние променливи? 918 00:58:05,340 --> 00:58:09,620 Само вид на тоа е веќе твое, нели? Тоа едноставно исчезнува вид на концептуално. 919 00:58:09,620 --> 00:58:13,950 Тоа е уште физички таму, очигледно, но тоа веќе не е Ваше право е да го користите. 920 00:58:13,950 --> 00:58:17,160 Ова очигледно е проблематично ако сакате да напишете функции во животот 921 00:58:17,160 --> 00:58:20,440 кои, всушност, алоцира меморија и не го даде назад веднаш. 922 00:58:20,440 --> 00:58:24,180 Случај во точка: Целта GetString во животот е да немаат идеја однапред 923 00:58:24,180 --> 00:58:26,390 колку е голема на низа Одам да напишеш на тастатура, 924 00:58:26,390 --> 00:58:30,390 но тоа е мора да биде во можност да алоцира меморија да се одржи Давид или здраво 925 00:58:30,390 --> 00:58:32,860 или цела есеј што корисникот може да внесе внатре 926 00:58:32,860 --> 00:58:35,280 Значи GetString е користење Примерок. 927 00:58:35,280 --> 00:58:38,910 Примерок мора да биде со користење на не магацинот; 928 00:58:38,910 --> 00:58:40,770 наместо тоа е со користење на овој нешто што се нарекува куп. 929 00:58:40,770 --> 00:58:44,430 Нема ништо различни за меморија. Тоа не е побрзо или побавно или нешто слично. 930 00:58:44,430 --> 00:58:46,570 Тоа е само физички во различна локација. 931 00:58:46,570 --> 00:58:50,120 >> Но правило е дека меморијата што е распределени на грамада 932 00:58:50,120 --> 00:58:56,180 никогаш нема да бидат одземени од вас, додека вие го викате - претпоставете - бесплатно. 933 00:58:56,180 --> 00:59:00,510 Спротивно на тоа, било која мемориска ве замолам за на магацинот од само прогласување низа 934 00:59:00,510 --> 00:59:03,320 или декларирање на променлива како што го правеле со недели, 935 00:59:03,320 --> 00:59:05,640 дека по дифолт завршува на магацинот. 936 00:59:05,640 --> 00:59:09,550 И дека работи одлично 90% од времето, но за оние поретки прилики 937 00:59:09,550 --> 00:59:12,470 каде што сакате да алоцира меморија и чувајте го околу себе, 938 00:59:12,470 --> 00:59:14,730 тогаш треба да се користи некоја функција како Примерок. 939 00:59:14,730 --> 00:59:19,370 Или ние се користи некоја функција како GetString, кои за возврат го користи Примерок. 940 00:59:19,370 --> 00:59:23,300 Ајде да видиме каде тоа може да се прекине, а потоа да погледнеме Binky. 941 00:59:23,300 --> 00:59:25,820 Ние ќе се вратам на тоа во иднина. 942 00:59:25,820 --> 00:59:29,270 Овде е супер едноставен програма која во првите 2 линии што прави? 943 00:59:29,270 --> 00:59:33,460 На англиски, она што овие првите 2 линии на код се направи во внатрешноста на главниот? 944 00:59:33,460 --> 00:59:35,600 [Нечујни студент одговор] 945 00:59:35,600 --> 00:59:37,880 Внимателни. Тоа не ми даде адресата на x или y. 946 00:59:37,880 --> 00:59:41,840 [Студент] Дава совети како да ints. >> Добро. Дај ми 2 покажувачи на цели броеви. 947 00:59:41,840 --> 00:59:45,130 Со други зборови, дај ми 2 парчиња на меморија што јас го задржи цртеж денес, 948 00:59:45,130 --> 00:59:46,950 иако јас го избриша сега, како плоштади. 949 00:59:46,950 --> 00:59:50,000 Дај ми 2 парчиња на меморија, наречен X, еден вика y - 950 00:59:50,000 --> 00:59:54,320 порано јас ги повика S и T - и она што е од типот на кој дел од меморијата? 951 00:59:54,320 --> 00:59:57,160 Тоа се случува да ја запази адреса. 952 00:59:57,160 --> 00:59:59,110 Тоа е од тип int *. 953 00:59:59,110 --> 01:00:01,630 >> Значи адреса на int крајот ќе живеат во X, 954 01:00:01,630 --> 01:00:03,860 адресата на некоја int крајот ќе живеат во y, 955 01:00:03,860 --> 01:00:08,460 но на почетокот, она што е внатре на x и y? Кој знае? Ѓубре вредности. 956 01:00:08,460 --> 01:00:10,180 Тоа нема никаква врска со покажувачи. 957 01:00:10,180 --> 01:00:12,720 Ако не сме се стави нешто таму, кој знае што е всушност таму? 958 01:00:12,720 --> 01:00:18,950 Сега, х. Што се случува овде? Ова е legit сега, бидејќи x е покажувач. Тоа е int *. 959 01:00:18,950 --> 01:00:21,870 Па тоа значи дека можам да се стави во х адресата на некои парче на меморија. 960 01:00:21,870 --> 01:00:25,120 Што значи Примерок се врати? Совршена, таа се враќа адреси, 961 01:00:25,120 --> 01:00:28,510 адресата на првиот бајт во целина дел од меморијата. 962 01:00:28,510 --> 01:00:31,140 Колку бајти е ова очигледно распределба, на пример, во апаратот? 963 01:00:31,140 --> 01:00:33,510 Што е со големина на int? 4. 964 01:00:33,510 --> 01:00:36,600 Ако мислите назад кон недела 1, тоа не е супер важно секогаш да се сеќавам дека, 965 01:00:36,600 --> 01:00:38,870 но во овој случај тоа е корисно да се знае, 4 бајти. 966 01:00:38,870 --> 01:00:41,770 Значи ова е распределба на грамада 4 бајти 967 01:00:41,770 --> 01:00:46,110 и тоа е враќање на адресата на првиот мене произволно. 968 01:00:46,110 --> 01:00:47,700 Сега, она што е х прави? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 што прави? 970 01:00:52,200 --> 01:00:57,150 Ако во овој момент во приказната имаме X, кој изгледа вака со некои ѓубре вредност, 971 01:00:57,150 --> 01:01:04,120 ова е сега y со некои ѓубре вредност, сега во алинеја 3 Сум доделени 4 бајти. 972 01:01:04,120 --> 01:01:06,950 Оваа слика суштина изгледа вака. 973 01:01:06,950 --> 01:01:12,010 Или поконкретно, ако ова е произволна адреса 123, тоа е она што нашата приказна сега изгледа како. 974 01:01:12,010 --> 01:01:23,940 * X = 42 сега значи што? Тоа значи одат на адреса 123 и ставете број 42 таму. 975 01:01:23,940 --> 01:01:26,220 Јас не треба да се подготви овие редови затоа што ние не правиме жици. 976 01:01:26,220 --> 01:01:29,480 >> Јас треба да имаат само напишано вака, и само заради демонстрација на, 977 01:01:29,480 --> 01:01:33,240 42 како int вид на зазема многу простор, 4 бајти. 978 01:01:33,240 --> 01:01:35,960 Значи тоа е она што се случило таму, но има еден проблем сега. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Што ќе се случи тука? 980 01:01:40,580 --> 01:01:46,470 Проблемот е * y во нашата поедноставен светот само значи одат на адреса во y. 981 01:01:46,470 --> 01:01:48,590 Што е во y? Тоа е некои ѓубре вредност. 982 01:01:48,590 --> 01:01:53,150 Значи, да претпоставиме дека ѓубрето вредност е 5551212, нешто лудо како што. 983 01:01:53,150 --> 01:01:56,750 * Y средства одат за решавање на 5.551.212. 984 01:01:56,750 --> 01:02:00,450 Тоа е како овде. Таа не постои, на пример. 985 01:02:00,450 --> 01:02:05,310 Значи * y добива 13 значи јас се обидувам да се подготви 13 тука. Тоа не постои. 986 01:02:05,310 --> 01:02:08,790 Сум го надмина сегмент на табла. Што можам да добијам? 987 01:02:08,790 --> 01:02:14,930 Тоа криптичната порака сегментација грешка, бидејќи јас се обидувам да се стави во меморија 988 01:02:14,930 --> 01:02:19,470 вредност како 13 на место кое не постои. 989 01:02:19,470 --> 01:02:23,900 Остатокот од програмата би можеле да работат во ред, но до тој момент не постои. 990 01:02:23,900 --> 01:02:25,350 Па ајде да се обидеме да кажам оваа приказна. 991 01:02:25,350 --> 01:02:27,830 Ние ќе се вратам на тоа еднаш ние разговаравме за хексадецимален. 992 01:02:27,830 --> 01:02:30,290 Да се ​​вратиме на ова и да склучува со оваа работа наречена Binky, 993 01:02:30,290 --> 01:02:33,710 кој се потсетиме е професор Стенфорд седат дома игра со claymation, 994 01:02:33,710 --> 01:02:36,380 да ја раскаже приказната за точно истата програма. 995 01:02:36,380 --> 01:02:40,580 Тоа е само околу 3 минути. Тука имаме Binky. 996 01:02:40,580 --> 01:02:45,030 [Машки говорник на видео] Еј Binky, разбудам. Тоа е време за покажувачот забава. 997 01:02:45,030 --> 01:02:50,080 [Binky] Што е тоа? Учат за покажувачи? О, стрина! 998 01:02:50,080 --> 01:02:53,700 [Машки звучник] Па, да започнеме, претпоставувам дека ние ќе треба неколку совети. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Во ред. Овој код доделува 2 совети кои може да укажуваат на цели броеви. 1000 01:02:57,890 --> 01:03:02,220 [Машки звучник] Во ред. Па, гледам 2 покажувачи, но тие не се чини дека се укажува на ништо. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Дека е во право. Првично, показалки не упатуваат на ништо. 1002 01:03:05,550 --> 01:03:09,270 Работите што се укаже се нарекуваат pointees, и поставување на нив е посебен чекор. 1003 01:03:09,270 --> 01:03:12,330 [Машки звучник] Ох, нели, нели. Знаев дека. На pointees се одвоени. 1004 01:03:12,330 --> 01:03:15,630 Ир, па како да одвои pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Во ред. Овој код доделува нов број pointee, и овој дел поставува на X да укажуваат на тоа. 1006 01:03:21,510 --> 01:03:23,500 [Машки звучник] Еј, што изгледа подобро. 1007 01:03:23,500 --> 01:03:26,030 Така осигурајте се да го направи тоа нешто. >> [Binky] Во ред. 1008 01:03:26,030 --> 01:03:30,300 Јас ќе Dereference на покажувачот на X да ја запази бројот 42 во своето pointee. 1009 01:03:30,300 --> 01:03:34,410 За овој трик ќе ми треба моето магично стапче на dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Машки звучник] Вашиот магично стапче на dereferencing? Тоа е одлично. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Ова е она што го кодот личи. Јас само ќе се постави на бројот и ... [Пукање звук] 1012 01:03:44,230 --> 01:03:46,100 [Машки звучник] Еј погледнете, оди. 1013 01:03:46,100 --> 01:03:50,990 Значи прави Dereference на х следи стрелката за да пристапите до своите pointee, 1014 01:03:50,990 --> 01:03:53,230 во овој случај за да ја запази 42 во таму. 1015 01:03:53,230 --> 01:03:57,630 Еј, обидете се да го користите за чување на број 13 преку други покажувач, г. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Во ред. Јас само ќе поминат тука на Y и да добијат број 13 се постави 1017 01:04:03,250 --> 01:04:08,360 а потоа да стапот на dereferencing и само ... [Зуењето на звукот] Леле! 1018 01:04:08,360 --> 01:04:10,980 [Машки звучник] О еј, тоа не функционира. 1019 01:04:10,980 --> 01:04:14,870 >> Да речеме, Binky, јас не мислам дека dereferencing y е добра идеја 1020 01:04:14,870 --> 01:04:17,880 бидејќи поставување на pointee е посебен чекор 1021 01:04:17,880 --> 01:04:19,850 и јас не мислам дека ние некогаш го направив тоа. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Хм, добра поента. 1023 01:04:21,770 --> 01:04:26,640 [Машки звучник] Да. Ние доделени на покажувачот y но ние никогаш не го постави да се укаже на pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Хм, многу капацитет. 1025 01:04:28,780 --> 01:04:30,690 [Машки звучник] Еј, ти си изгледа добро таму, Binky. 1026 01:04:30,690 --> 01:04:34,160 Можете да го поправам така што y поени на истиот pointee како х? >> [Binky] Секако. 1027 01:04:34,160 --> 01:04:37,100 Ќе се користи моето магично стапче на покажувачот задача. 1028 01:04:37,100 --> 01:04:39,070 [Машки звучник] е дека ќе биде проблем како и пред тоа? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Не, ова не допре pointees. 1030 01:04:40,840 --> 01:04:44,780 Тоа само ја менува еден покажувачот да се укаже на една иста работа како на друг. [Пукање звук] 1031 01:04:44,780 --> 01:04:48,570 [Машки звучник] О, гледам. Сега y поени на истото место како x. 1032 01:04:48,570 --> 01:04:51,140 Па почекајте. Сега y е фиксна. Таа има pointee. 1033 01:04:51,140 --> 01:04:54,520 Па може да се обидете стапот на dereferencing повторно да се испрати на 13 завршена. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Ух, добро. Овде оди. [Пукање звук] 1035 01:04:58,130 --> 01:05:01,250 [Машки звучник] Еј, види го тоа. Сега dereferencing дела на y. 1036 01:05:01,250 --> 01:05:05,200 И бидејќи покажувачи се делат дека еден pointee, тие и двете се види 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Да, споделување. Сеедно. 1038 01:05:06,910 --> 01:05:08,880 >> Значи одиме да се префрлиш места сега? 1039 01:05:08,880 --> 01:05:11,420 [Машки звучник] О изглед, ние сме надвор од времето. >> [Binky] Но - 1040 01:05:11,420 --> 01:05:13,880 [Машки звучник] Само сети се на 3 покажувачот правила. 1041 01:05:13,880 --> 01:05:18,630 Број 1, основната структура е дека имате покажувач и тоа укажува текот на pointee. 1042 01:05:18,630 --> 01:05:23,120 Но покажувач и pointee се одвоени, а честа грешка е да се постави покажувач 1043 01:05:23,120 --> 01:05:25,680 но да се заборави да го даде pointee. 1044 01:05:25,680 --> 01:05:29,580 Број 2, покажувачот dereferencing почнува на покажувачот и го следи неговото стрелката над 1045 01:05:29,580 --> 01:05:31,060 да пристапите до своите pointee. 1046 01:05:31,060 --> 01:05:34,340 Како што сите знаеме, ова работи само ако постои pointee, 1047 01:05:34,340 --> 01:05:36,460 кој вид на се врати да владее број 1. 1048 01:05:36,460 --> 01:05:39,870 Број 3, покажувачот задача трае еден покажувач и менува тоа 1049 01:05:39,870 --> 01:05:42,390 да се укаже на истиот pointee како уште еден покажувач. 1050 01:05:42,390 --> 01:05:45,890 Значи, по задача, 2 покажувачи ќе укаже на истиот pointee. 1051 01:05:45,890 --> 01:05:47,800 Понекогаш тоа се нарекува споделување. 1052 01:05:47,800 --> 01:05:50,910 >> И тоа е сè што постои на неа навистина. Bye-bye сега. 1053 01:05:50,910 --> 01:05:55,840 Ова е Binky. Ова е CS50. Ние ќе се видиме следната недела. [Аплауз] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]