[Powered by Google Translate] Давайте поговорим о структур. Структуры дают нам способ группировки кучу переменных вместе в красивый пакет. Это, наверное, проще всего увидеть пример прямо сейчас, поэтому мы говорим структуры, Затем открытие фигурной скобкой, и в этой структуре, мы будем иметь Int возраста, символ названия *, вот и все. Это может показаться странным точку с запятой после фигурной скобки, но это на самом деле необходимо с структурам. Любой допустимый тип может пойти в структуре определению. Здесь мы использовали Int и символ *, но Вы можете также использовать массив, из, скажем, 100 элементов или даже в другой структуре. Когда вы используете структур в C, Вы создаете новые типы из коллекции других типов. Здесь мы делаем новый тип из целого числа и символ *. Как мы увидим позже, тип структуры В многом эквивалентна любой другой тип вы привыкли. Обычно, я буду сравнения, как тип структуры похож на целое типа. В то время как мы писали код действителен C, это не очень полезно, и лязг даст нам предупреждение. Помните, как структуры и ее похожи? Ну, мы в основном просто сказал INT, которое не является очень полезным линии. Так что давайте на самом деле объявить переменную этого типа , дав ему имя перед точкой с запятой. Мы будем называть переменную студента. Сейчас мы объявили переменную называемую студента с типом задается структурой. Как нам добраться до переменных внутри структуры? Технически, имена для таких переменных являются ее членами. Чтобы получить доступ к любому конкретному члену в студенческой структуры, Вы добавляете точку на имя переменной, следует имя члена вы хотите. Так вот, только 2 действительно возможностями являются student.age и student.name. И мы можем сделать что-то вроде student.age = 12 и student.name = студента. А что, если мы хотели сделать второй студент? Вы можете подумать, чтобы скопировать и вставить эти строки и изменить студент студент 2 или что-то, и что будет работать, но технически, студент и студентка 2 не имеют такого же типа. Видите, вы не сможете назначить их друг с другом. Это потому, что до сих пор, ваша структура была анонимной. Мы должны дать ему имя. Чтобы сделать это, мы вставляем название структуры после слов структуры. студент, последующим определением. Мы все еще можем немедленно объявить переменную типа Построим студент, как мы делали это раньше. Мы будем называть его S1 Давая структуру имени, Теперь мы можем использовать структуры студента почти точно так же, мы хотели бы использовать Int. Таким образом, мы можем объявить переменную типа студент структуры, вроде Структура студент S2. Как и массивы, структуры обеспечивают синтаксис контекстного инициализации, таким образом, мы можем сказать, структура студент S2 равно левой фигурной скобкой 3, S2. Здесь, S2.age будет 3, и S2.name будет указывать на S2. Подумайте, что вы можете сделать с целого типа и большинство из них можно сделать с типом студента структуры. Мы можем использовать структуры студента как тип параметра функции. Мы можем использовать структуры студента в новой структуре. Мы можем иметь указатель на структуру студента. Мы можем сделать размер структуры студента. Struct студентов является одним из видов как Int является типом. Мы также можем назначить S1 и S2 поскольку оба имеют одинаковый тип, так что мы можем сделать S1 = S2. Что произойдет, если мы делаем S1.age = 10? Ли S2 изменения на всех? Опять же, думаю структуры так же, как регулярные целые числа. Если задать некоторые Int X некоторой Y Int, как X = Y , а затем изменить X, как и в X + +, Y изменится ли вообще? Y не меняется здесь, и поэтому ни один не делает S2 выше. S2.age еще 3. Но учтите, что при назначении одна структуры к другой, все указатели по-прежнему указывают на одно и то же, так как они были просто скопированы. Если вы не хотите, чтобы указатели для совместного использования, Вам придется вручную справиться с этим, возможно, malicking один блок памяти для одного из указателей указывает на и копирования данных на. Это может быть раздражающим, чтобы написать структура студентов во всем мире. Использование типа определение, мы можем сделать Тип четкости Структура и мы будем называть его учеником. Теперь мы можем использовать студентов во всем мире что мы привыкли использовать структуру студента. Этот тип ДЕФа анонимные структуры и называет его учеником. Но если мы будем также держать студентов идентификатор рядом со словом структуру, как и в ЬурейеЕ студент структуры, мы могли бы использовать оба студента структуры и студентов взаимозаменяемы сейчас. Они даже не должны иметь то же самое имя. Мы могли бы ввести определение структуры студента Боба , а затем построим студента и Бобу бы быть взаимозаменяемыми типов. Независимо от типа DEF, мы должны идентификатор следующего на структуру если определение структуры рекурсивно. Например, Тип определение структуры узла и он будет определен как Int вал и она будет иметь указатель, который указывает на другую структуру узла., как в структуре узла * следующий. И тогда мы будем называть его узлов. Эта структура является рекурсивной, Поскольку определение структуры узла содержит в себе указатель на структуру узла. Обратите внимание, что мы должны сказать, структура узла * Следующий Внутри определения структуры узла, так как определение типа еще не закончился, чтобы позволить нам упростить эту просто узел * следующий. Вы узнаете больше о структурах похожа на эту при работе со связанными списками и деревьями. А как насчет структур в функции? Это также вполне допустимо. Мы могли бы аннулировать функции , которая принимает в качестве аргумента, Студент с и делает что-то с этим студентом. И тогда мы можем передать его в качестве студента структура следующим образом. Func из S1, чем прежде. Структура ведет себя точно так, как целое будет, когда передается в функцию. Func получает копию S1 и поэтому не может изменить S1; , а только копия, которая хранится в С. Если вы хотите функцию, чтобы иметь возможность изменить S1, функции необходимо будет принять студента * S, и вам придется пройти S1 по адресу, вот так. Студенческие * S, функции и S1. Там еще одна причина, чтобы пройти по адресу здесь. Что, если наша структура содержала 100 полей? Каждый раз, когда мы переходим студента функций, наша программа должна скопировать все эти 100 полей в аргументе S функций, в даже если он никогда не использует подавляющее большинство из них. Поэтому, даже если функция не планируется изменение студента, если все еще может быть ценным для передачи по адресу. Хорошо, что, если мы хотим создать указатель на структуру? Мы могли бы сделать что-то вроде Студент * S равно таНос Размер студента. Обратите внимание, что размер все еще работает здесь. Так как же нам теперь получить доступ к возрасту член блока, который указывает на S? Вы могли бы сначала подумать, чтобы сделать * S.age = 4, но это не совсем работает. Так как это действительно будет интерпретироваться как * S.age в скобках = 4, который даже не компиляции, Так как S не является структурой или, скорее, указатель на структуру, и поэтому точка здесь работать не будет. Мы могли бы сделать (* S). Возраст = 4 но скобках может раздражать и запутанной. К счастью, у нас есть специальный оператор стрелка который выглядит примерно так S-> возрастом = 4. Эти 2 способа ссылкой возраста эквивалентны и мы действительно не понадобится стрелка оператора, но он делает вещи выглядят лучше. Так как S является указателем на некоторый блок памяти, который содержит структуру, Вы можете думать о возрасте S> как следовать за указателем стрелки и захватить возраст членов. Так почему мы должны всегда использовать структуры? Это определенно можно уйти только с примитивными целых чисел, символы, указатели и т.п. что мы привыкли; вместо S1 и S2 и раньше, Мы могли бы иметь age1, age2, name1 и name2 Все на отдельных переменных. Это нормально, только с 2 студентами, Но что, если у нас было 10 из них? А что, если вместо того, чтобы только 2 поля, Студент структуры было 100 полей? GPA, курсы, цвет волос, пол и так далее. Вместо всего 10 структур, нам нужно 1000 отдельных переменных. Кроме того, рассмотреть функцию , которая принимает, что структура с 100 полей с единственным аргументом и выводит все поля. Если мы не будем использовать структуру, каждый раз, когда мы называем эту функцию, Мы должны передать на все 100 переменных, и если у нас есть 100 переменных для студентов 1, и 100 переменных для студентов 2, Мы должны быть уверены, что мы случайно не передать некоторые переменные из студент 1 и некоторые переменные из студентов 2. Это невозможно сделать, что ошибка с структурой, так как все 100 переменных, содержащихся в едином пакете. Буквально за пару Заключительные замечания: Если вы поняли все до этого момента, здорово. Остальная часть видео просто ради полноты. Поскольку структуры может содержать любой тип указателя, они также могут держать указатели на функции. Если вы знакомы с объектно-ориентированным программированием, это дает возможность использовать структуры программ в объектно-ориентированном стиле. Еще на указатели на функции в другое время. Кроме того, иногда вы можете иметь 2 структуры определения которых зависят друг от друга. Например, мы могли бы иметь структуру, которая определяется как указатель на структуру B, Структура B * X, и теперь мы можем есть структура B которая определяется как указатель на структуру, Структура * Y. Но это не будет компилироваться, так как структура B не существует, в то время, структура составляется. И если мы будем менять структуру и структуру B, Затем мы просто оставили с той же проблемой; это время, с строим не существует. Чтобы решить эту проблему, мы можем написать Структура B; Перед определением структуры A. Это называется вперед декларации. Это просто позволяет компилятору известно, что Структура B является допустимым типом, который будет полностью определено позднее этого срока или в другом месте. Меня зовут Боб Боуден, и это CS50. [CS50.TV]