[Powered by Google Translate] Ајде да зборуваме за низи.
Па зошто би некогаш сакате да ги користите низи?
Па да речеме имаш некоја програма што треба да ги чувате 5 студент ИД.
Тоа би можело да чини разумно да се има 5 одделни променливи.
Од причини што ќе видиме во малку, ние ќе започнеме сметано од 0.
Променливи ќе имаме ќе биде int id0, int id1, и така натаму.
Секое логика сакаме да настапи на еден студент проект ќе треба да бидат копирани и атипичен
за секој од овие студент ИД.
Ако сакаме да се провери која студентите се случи да биде во CS50,
ние прво ќе треба да се провери ако id0 претставува на студентот во текот.
Потоа да го стори истото за следниот студент, ќе треба да го копирате и залепите код за id0
и да ја замени сите појавувања на id0 со id1 и така натаму за ID2, 3 и 4.
>> Штом ќе слушнете дека ние треба да го копирате и залепите,
треба да почнам да размислувам дека постои подобро решение.
Сега што ако сфаќаш дека не треба 5 студент ИД туку 7?
Вие треба да одат назад во вашиот изворен код и да го додадете во id5, на id6,
и да копирате и залепите на логиката за проверка дали ИД припаѓаат на класата за овие 2 нови лични карти.
Нема ништо поврзување на сите овие лични карти заедно, и така не постои начин на поставување
на програмата за да го направи тоа за лични карти 0 до 6.
Па сега можеме да согледаме дека има 100 студент ИД.
Тоа е почнуваат да чини помалку од идеален да треба одделно да пријават секоја од овие лични карти,
и да копирате и залепите од секоја логика за новите лични карти.
Но, можеби ние сме решени, и ние го направи тоа за сите 100 ученици.
Но, што ако не знаеш колку студенти таму всушност се?
Постојат само некои n студентите и вашата програма треба да побара од корисникот што дека n е.
Ух ох. Ова не се случува да се работи многу добро.
Вашата програма работи само за некои постојан број на студенти.
>> Решавање на сите овие проблеми е убавината на низи.
Значи она што е низа?
Во некои програмски јазици низа тип може да биде во можност да се направи малку повеќе,
но тука ние ќе се фокусираат на основните низа податоци структура онака како што ќе го видите во C.
Низа е само една голема блок на меморија. Тоа е тоа.
Кога велиме имаме низа од 10 броеви, што само значи дека ние имаме некои блок
на меморија што е доволно голем за да се одржи 10 одделни цели броеви.
Претпоставувајќи дека цел број е 4 бајти, тоа значи дека низа од 10 броеви
е континуиран блок од 40 бајти меморија.
Дури и кога користите мултидимензионална низи, кои ние не би навлегувал во тука,
тоа е уште само еден голем блок од меморија.
На мултидимензионална нотација е само погодност.
Ако имате 3 од 3 мултидимензионална низа од цели броеви,
тогаш вашата програма ќе навистина само третираат оваа како голем блок од 36 бајти.
Вкупниот број на цели броеви е 3 пати 3, и секој број го зазема 4 бајти.
>> Ајде да ги разгледаме во основен пример.
Можеме да видиме тука 2 различни начини на прогласување низи.
Ние ќе мора да коментираат 1 од нив и надвор за програмата за да ги собере
бидејќи ние објави X двапати.
Ние ќе ги разгледаме во некои од разликите помеѓу овие 2 вида на декларации во малку.
И двете од овие линии прогласи низа на големина N,
каде што имаме # define N како 10.
Ние може да исто како лесно да побара од корисникот за позитивен цел број
и се користи таа цел број како број на елементи во нашата низа.
Како нашите студентски проект пример пред, ова е вид на како одредат 10 целосно одделен
имагинарен променливи; x0, x1, x2, и така натаму до xn-1.
Игнорирањето на линии каде што прогласи низа, забележуваат квадратни загради непроменети
внатрешноста на за петелки.
Кога ние пишуваме нешто како x [3], која јас само ќе прочитате како x заградата 3,
можете да мислам на тоа како да прашуваш за имагинарното X3.
Забележите отколку со низа на големина N, тоа значи дека бројот внатрешноста на заградата,
кои ќе се јавите на индекс, може да биде ништо од 0 до n-1,
што е вкупно N индекси.
>> Да се ​​размислува за тоа како всушност работи
се сеќавам дека низата е голем блок од меморија.
Претпоставувајќи дека цел број е 4 бајти, целиот спектар x е 40 бајт блок од меморија.
Значи x0 се однесува на првите 4 бајти од блок.
X [1] се однесува на следните 4 бајти и така натаму.
Ова значи дека на почетокот на x е сите програмски некогаш треба да ги пратите.
Ако сакате да го користите x [400], а потоа на програмата знае дека ова е еквивалент
само 1.600 бајти по почетокот на x.
Каде да добиеме 1.600 бајти од? Тоа е само 400 пати 4 бајти во цел број.
>> Пред да се пресели, тоа е многу важно да сфатат дека во C
не постои спроведување на индекс, кој ние ги користиме во низа.
Нашите големи блок е само 10 броеви долг, но ништо нема да се развикам нас ако ние пишуваме x [20]
или дури x [-5].
Индексот дури и не мора да биде број.
Тоа може да биде какво било произволно изразување.
Во програмата се користи променлива i од за телефонска линија за индексирање во низа.
Ова е многу честа шема, looping од i = 0 до должината на низата,
и тогаш јас користи како индекс за низа.
На овој начин можете успешно јамки низ целата низа,
и можете да доделиш на секоја точка во низа или да ја користите за некои пресметка.
>> Во првиот за телефонска линија, јас започнува од 0,
и така ќе му ја додели на 0 место во низа, вредноста 0 пати 2.
Тогаш јас зголемување, а ние му ја додели првата точка во низа на вредност 1 пати 2.
Тогаш јас чекори повторно и така натаму се до што му ја додели на положбата N-1 во низа
вредноста N-1 пати 2.
Значи ние направивме низа со првите 10 дури и броеви.
Можеби изедначува би биле малку подобро име за променливата од x,
но тоа би дале работи.
Вториот за јамка потоа само печати вредностите кои ние веќе складирани во внатрешноста на низата.
>> Ајде пробајте да ја отворите програмата со двата типа на низа декларации
и погледнете на излез од програмата.
Колку што можеме да видиме, на програмата се однесува на истиот начин за двата вида на декларации.
Ајде, исто така, да ги разгледаме во она што се случува ако се промени првиот циклус да не запре на N
туку велат дека 10.000.
Начин надвор од крајот на низата.
Упс. Можеби сте виделе досега.
А сегментација грешка значи вашата програма падна.
Можете да започнете да гледате овие кога ќе се допрат области на меморија не треба да се допираат.
Еве ние се допираат 10.000 места надвор од почетокот на X,
кој евидентно е место во меморијата ние не треба да се допираат.
Па повеќето од нас веројатно не случајно ќе ја стави 10.000 наместо на N,
но што ако правиме нешто посуптилно како велат пишуваат помала или еднаква на N
во за телефонска линија состојба за разлика од помалку од Н
Запомнете дека низа има само индекси од 0 до n-1,
што значи дека индекс N е надвор од крајот на низата.
Програмата не може да се сруши во овој случај, но тоа е уште една грешка.
Всушност, оваа грешка е толку вообичаени што има тоа е сопствено име,
исклучи од 1 грешка.
>> Тоа е тоа за основите.
Значи она што се главните разлики помеѓу 2 вида на низа декларации?
Една разлика е местото каде што голем блок од меморијата оди.
Во првата изјава, која Ќе му се јавам на заградата-низа тип,
иако ова е никој случај не значи конвенционалните име,
тоа ќе оди на оџак.
Додека во втората, што ќе се јавите на покажувачот-низа тип, тоа ќе оди на грамада.
Ова значи дека кога функцијата се враќа, заградата низа автоматски ќе биде deallocated,
а како што explicitily мора да се јавите бесплатно на покажувачот низа
или на друго место имаш меморија излегуваат во јавноста.
Покрај тоа, заградата низа всушност и не е променлива.
Ова е важно. Тоа е само симбол.
Можеш да мислиш за тоа како постојана дека компајлерот избира за вас.
Ова значи дека не можеме да правиме нешто како x + + со држач тип,
иако ова е совршено валидни со покажувачот тип.
>> Покажувачот тип е променлива.
За покажувачот тип, имаме 2 посебни блокови од меморијата.
Променливата x себе се чуваат во магацинот и е само еден покажувач,
но голем блок од меморија се чуваат на грамада.
Променливата x на магацинот само продавници адреса
на голем блок од меморијата на грамада.
Една импликација од ова е со големина на оператор.
Ако прашате за големината на заградата низа, таа ќе ти даде големината на голем блок од меморија,
нешто како 40 бајти,
но ако ги прашате за големината на покажувачот тип на низа,
тоа ќе ви даде на големината на променливата x себе, што на апаратот е веројатно само 4 бајти.
Користење на покажувачот-низа тип, тоа е невозможно да се директно побара
големината на голем блок од меморија.
Ова не е обично многу на ограничување, бидејќи ние многу ретко сакате големината
од големите блок од меморија, а ние обично може да се пресмета ако е потребно.
>> Конечно, заградата низа случува да ни обезбеди со кратенка за иницијализацијата низа.
Ајде да видиме како би можеле да пишуваат на првите 10 дури и броеви со користење на кратенка initilization.
Со покажувачот низа, не постои начин да го направите кратенка допаѓа ова.
Ова е само вовед во она што можете да направите со низи.
Тие се појави во речиси секоја програма ќе ви пишувам.
Се надеваме дека сега може да се види подобар начин на вршење на студентот ИД пример
од почетокот на видеото.
>> Моето име е Роб Бауден, и ова е CS50.