[Powered by Google Translate] Да поговорим за масиви.
Така че, защо бихме някога искате да използвате масиви?
Добре, нека кажем, че имате програма, която трябва да се съхранява пет студентски документи за самоличност.
Тя може да изглежда разумно да има пет отделни променливи.
По причини, които ще видим в малко, ние ще започнем да броим от 0.
Променливи, ще имаме, ще бъде INT id0, вътр ID1 и така нататък.
Каквато и да е логика, ние искаме да се изпълнява на един студент ID, ще трябва да се копира и
за всяка една от тези студентски документи за самоличност.
Ако искаме да се провери кои студенти се случи да бъде в CS50,
ние ще трябва първо да се провери дали id0 представлява студент в курса.
След това, за да направим същото и за следващата студент, ние ще трябва да копирате и поставите кода за id0
и замени всички срещания на id0 с ID1 и така нататък за ID2, 3 и 4.
>> Веднага след като чуят, че ние трябва да копирате и поставите,
трябва да започнем да мислим, че има по-добро решение.
Сега какво, ако ти осъзнаваш, не е нужно 5 студентски документи за самоличност, а по-скоро 7?
Вие трябва да се върнете в изходния си код и добавете в ID5, id6
и да копирате и поставите логика за проверка, ако идентификатори принадлежат към класа за тези две нови документи за самоличност.
Няма нищо свързване на всички тези документи за самоличност, така че няма начин да поискат от
програмата да направи това за документи за самоличност 0 до 6.
Е, сега, че сте 100 студентски документи за самоличност.
Започва да изглежда по-малко от идеални, за да е необходимо да декларират всяка отделно от тези документи за самоличност,
и да копирате и поставите каквато и да е логика за тези нови документи за самоличност.
Но може би ние се определят и ние го правим за всички 100 ученици.
Но какво, ако не знаете колко студенти са в действителност?
Има само някои н студенти и вашата програма трябва да поиска ползвателят какво н е.
Ъ-ъ о. Това няма да работят много добре.
Програмата работи само за някои постоянен брой на студентите.
>> Решаването на всички тези проблеми е красотата на масиви.
И така, какво е масив?
В някои езици за програмиране тип масив може да бъде в състояние да направи малко повече,
но тук ние ще се съсредоточим върху основния масив структурата на данните, точно както ще го видите в C.
Масивът е просто един голям блок от паметта. Това е всичко.
Когато казваме, че имаме масив от 10 числа, това просто означава, че ние имаме някои блок
на паметта, която е достатъчно голяма да побере 10 отделни числа.
Ако приемем, че е цяло число е 4 байта, това означава, че масив от 10 числа
е непрекъснат блок от 40 байта в паметта.
Дори когато използвате многомерни масиви, които ние няма да вляза тук,
тя все още е просто един голям блок от паметта.
Разностранният нотация е само за удобство.
Ако имате 3 от 3 многомерен масив от цели числа,
тогава вашата програма ще наистина само лечение на това като голям блок от 36 байта.
Общият брой на числа е 3 пъти по 3, и всяко число заема 4 байта.
>> Нека да разгледаме основен пример.
Ние можем да видим тук два различни начина за обявяване на масиви.
Ще трябва да се коментира 1 от тях за програмата за съставяне на
тъй като ние заявяваме два пъти.
Ние ще разгледаме някои от разликите между тези два вида декларации в малко.
И на тези редове декларира масив с размер N,
където сме # определят N 10.
Ние можем просто толкова лесно да попита потребителя за положително число
и се използва това число като броя на елементите в нашата масив.
Както нашия пример студентска карта преди, това е нещо като обявяване на 10 напълно отделен
въображаеми променливи; x0, x1, x2, и така нататък до едно XN.
Пренебрегването на линии, където ние заявяваме масива, забележете квадратни скоби непокътнати
вътре за вериги.
Когато пиша нещо подобно X [3], което аз просто ще чете като х скоба 3,
можете да мислите за него, все едно да питаш за въображаема x3.
Известие от масив с размер N, това означава, че вътре в скобите,
които ние ще се обадя на индекса, може да бъде нещо от 0 до N-1,
което е общо N на индексите.
>> Да се ​​мисли за това как всъщност работи
не забравяйте, че масивът е голям блок от паметта.
Ако приемем, че е цяло число е 4 байта, цялата х масив е 40 байт блок на паметта.
Така че x0 се отнася до първите 4 байта на блока.
X [1] се отнася до следващите 4 байта и така нататък.
Това означава, че началото на X е програмата някога трябва да следите.
Ако искате да използвате [400], след което програмата се знае, че това е еквивалентно
до 1600 байта след началото на х.
Откъде получавате 1600 байта от? Това е само 400 пъти по 4 байта на цяло число.
>> Преди да преминем, това е много важно да се осъзнае, че в C
не е изпълнението на индекса, който ние използваме в масива.
Нашият голям блок е само на 10 числа, но нищо няма да крещи по нас, ако напишете [20]
или дори [-5].
Индексът дори не трябва да бъде число.
Тя може да бъде произволна израз.
В програмата ние използваме променлива I от цикъл да се индекс в масива.
Това е много често срещан модел, примка от I = 0 до дължината на масива,
и след това да използвате, след като индексът за масив.
По този начин ефективно линия за цялата решетка,
и вие може да възложи на всяко място в масива или да го използвате за някои изчисления.
>> В първата за контур, аз започва от 0,
и така той ще възложи на място 0 в масива, стойността 0 пъти 2.
Тогава аз стъпки, и ние определяме първо място в масива на стойност 1 пъти 2.
Тогава стъпки отново и така нататък, докато ние определяме позиция N-1 в масива
стойността на N-1 пъти 2.
Така че, ние създадохме масив с първите 10 четни числа.
Може би изравнява щеше да е малко по-добро име за променливата от х
но това би дало нещата далеч.
Секунда за контур и след това се извеждат стойностите, че вече сме се съхраняват във вътрешността на масива.
>> Нека се опитаме да стартирате програмата с двата вида на масива декларации
и да погледнем на изхода на програмата.
Що се отнася, както можем да видим, програмата се държи по същия начин и за двата вида декларации.
Нека също така да погледнете какво се случва, ако променим първа линия, за да не спре на N
, а по-скоро се каже, 10000.
Път след края на масива.
Опа. Може би сте виждали преди.
Сегментация вина означава, че програмата ви е разбил.
Можете да започнете да виждате, когато ви докосва области на паметта не трябва да се докосват.
Тук ние се докосват 10 000 места отвъд началото на X,
което очевидно е място в паметта, не трябва да се докосват.
Така че повечето от нас вероятно не би случайно постави 10000 вместо N
но какво, ако ние не направим нещо по-фино като казват, пишат по-малка или равна на N
в контур състояние, за разлика от по-малко от N.
Не забравяйте, че масив има само индекси от 0 до N-1,
което означава, че индекс N е след края на масива.
Програмата не може да се срине в този случай, но тя все още е грешка.
В действителност, тази грешка е толкова общ, че тя разполага със собствено име,
на разстояние от една грешка.
>> Това е за основите.
Така че какви са основните разлики между два типа на масива декларации?
Една от разликите е мястото, където големия блок на паметта отива.
В първата декларация, която ще се обадя на конзолата масив тип,
макар че това в никакъв случай не означава условно название,
тя ще отиде на стека.
Като има предвид, че втората, която ще се обадя показалеца Типът масив, тя ще отиде на куп.
Това означава,, че когато функцията връща, на конзолата масив ще бъде автоматично deallocated,
като има предвид, че трябва да explicitily обаждате безплатно на показалеца масив
или пък имате изтичане на памет.
Освен това, на конзолата масив всъщност не е променлива.
Това е важно. Това е просто символ.
Можете да мислите за него като за постоянно, че компилаторът избира за вас.
Това означава, че не можем да направим нещо като х + + със скоба тип,
въпреки че това е напълно валидно с показалеца тип.
>> Показалеца тип е променлива величина.
За показалеца тип, имаме две отделни блокове памет.
Променливата х се съхраняват в стека и е само един указател,
но големия блок на паметта се съхранява на куп.
Променливата х в стека само съхранява адрес
на големия блок на паметта на куп.
Един от изводите на това е с размера на оператора.
Ако питате за размера на конзолата масив, тя ще ви даде размера на големия блок на паметта,
нещо като 40 байта,
но ако питаш за размера на показалеца тип масив,
тя ще ви даде размера на променливата х, върху уреда е вероятно само на 4 байта.
Използването на тип показалеца масив, е невъзможно да се обърнат пряко
размера на големия блок на паметта.
Това обикновено не е много на ограничение, тъй като ние много рядко искате размерът
памет на големия блок, и ние обикновено може да се изчисли, ако имаме нужда от него.
>> И накрая, на конзолата масив се случва, да ни предоставите пряк път за инициализиране на масив.
Нека да видим как бихме могли да пишат първите 10 четни числа, използвайки контекстното initilization.
С показалеца масив, няма начин да се направи пряк път по този начин.
Това е само въведение към какво можете да направите с масиви.
Те се появи в почти всяка програма, която пиша.
Надяваме се, сега може да види по-добър начин за правене на студентски документи за самоличност например
от началото на видеото.
>> Моето име е Роб Боудън, и това е CS50.