>> [Jouer de la musique]
>> DOUG LLOYD: OK.
Nous avons travaillé avec des nombres entiers, nous avons travaillé avec des personnages,
nous avons travaillé flotteurs, doubles, les chaînes et bools.
Nous avons épuisé à peu près tout des [inaudible] types qui
ont été mis à notre disposition tout le long.
Mais maintenant, nous voulons faire quelque chose de plus.
Comment fait-on cela?
Comment pouvons-nous créer différents types de données?
Nous pouvons le faire en utilisant des structures.
Donc structures nous permettent d'unifier des variables de différents types
en un seul, le nouveau type de variable, que nous pouvons attribuer son propre nom de type.
Ceci est une très forte chose pour être en mesure de le faire,
parce que nous pouvons désormais groupe des éléments de différents types de données
ainsi que disposer d'une connexion logique.
Nous avons été en mesure de le faire avec des tableaux de genre, non?
Nous pouvons variables de groupe du même type de données
ensemble dans une grande unité de mémoire, un tableau.
>> Mais nous avons pas été en mesure de mélanger place différents types de données ensemble.
Nous ne pouvons pas, par exemple, associer un nombre entier, et un caractère, et un double tous
dans la même chose et appeler cela une seule unité.
Mais avec des structures, ou souvent dénommée structs,
Nous pouvons en fait.
Donc, une structure est en quelque sorte des comme une variable de super.
Il est une variable qui contient d'autres variables à l'intérieur.
Alors, voici un exemple de une structure très simple.
Ceci est ce que la syntaxe ressemblerait souhaite créer une structure pour une voiture.
Maintenant, nous allons passer par la syntaxe ici.
Struct, qui est la mot-clé qui indique
que je suis la création d'un nouveau type de données ici.
En particulier, le nom du type de données est va être struct voiture, comme nous le verrons.
Mais ceci est le genre de pointe OFF pour le compilateur que cette
en tant que groupe de variables qui se passe être considéré comme faisant partie du même type
dans une minute.
>> Voitures, juste le nom de la structure.
Encore une fois, le type de données va ici être struct voiture, et pas seulement la voiture.
Mais si vous avez different-- Si vous créez plusieurs structs
dans le même programme, vous devez la distinction entre structure et struct.
Donc struct voiture, je pourrais aussi avoir struct étudiant, par exemple,
dans le même programme.
A l'intérieur des accolades sont tous les champs dits,
ou les membres de la structure.
Alors, quelles sont certaines des choses qui sont inhérents à une voiture?
Eh bien, il a généralement un an, a un nom de modèle, et une plaque d'immatriculation,
un odomètre qui a habituellement un certain nombre de miles sur elle,
et peut-être une taille de moteur.
Et comme vous pouvez le voir, je vais mélanger entiers et des personnages et doubles.
Ils vont tous être partie de ce nouveau type de données.
>> Enfin, la dernière chose que je dois faire, ne pas oublier ce petit point-virgule
à la fin.
Après avoir fini de définir la structure, nous devons mettre un point-virgule à la fin.
Il est un très commun syntaxique erreur, parce que d'une fonction,
par exemple, vous avez juste accolade ouverte, accolade à proximité.
Vous ne mettez pas une virgule à la fin d'une définition de fonction.
Cela ressemble à une fonction définition, mais il est pas,
et ainsi le point-virgule, il est juste un rappel que vous
besoin de le mettre là, parce Le compilateur pas autrement
savoir quoi faire avec elle.
Il est une erreur très commune à faire accidentellement
quand vous êtes le premier à définir des structures.
>> D'ACCORD.
Donc, nous définissons habituellement nos structures au sommet de nos programmes
parce qu'ils vont probablement pour être utilisé par de multiples fonctions.
Nous ne voulons pas de définir une struct à l'intérieur d'une fonction,
car alors nous pouvons le terre que: champ d'application de la structure vraiment
existe seulement à l'intérieur de cette fonction.
Nous aurions probablement voulons définir une structure afin que nous puissions l'utiliser dans de multiples fonctions,
ou peut-être dans de multiples les fichiers qui sont attachés ensemble
pour créer notre programme unique.
Parfois aussi la place de définition de la structure
au sommet où vous mettez votre livre comprend et votre livre définit,
Par exemple, vous pourriez les mettre en fichiers dot h séparés, que vous alors
livre vous inclure.
>> Donc, nous avons des structures, mais maintenant nous avons besoin de pénétrer à l'intérieur d'eux.
Comment pouvons-nous obtenir de l'intérieur une structure d'accès
ces sous-variables, ces variables qui existent à l'intérieur de la structure?
Eh bien, nous avons quelque chose appelé l'opérateur point, ce qui nous permet
pour accéder aux champs de la structure.
Ainsi, par exemple, disons que je ai déclaré mes données de type de structure, quelque part
au sommet de mon programme, ou peut-être en un fichier dot h que je l'ai livre inclus.
Si je veux ensuite pour créer un nouveau variable de ce type de données, je peux dire,
voiture de struct, ma voiture, point-virgule.
Tout comme je pourrais dire int x, ou le nom de la chaîne virgule.
>> Le type de données ici est la voiture de struct, le nom de la variable est ma voiture,
et puis je peux utiliser l'opérateur point pour accéder aux différents domaines de ma voiture.
Donc, je peux dire que ma voiture dot année est égal à 2,011.
Voilà parfaitement bien.
Année, si vous vous souvenez, a été définie comme une integer champ intérieur de cette voiture de struct
Type de données.
Donc, toutes les variables de données de la voiture struct type, comme ma voiture, je peux dire que ma voiture
année dot égaux et ensuite affecter il quelque valeur entière, 2011.
Mon assiette voiture de points est égal CS50.
Ma carte de point kilométrique est égal à 50505 point-virgule.
Tous ceux qui sont parfaitement bien et que ce
la façon dont nous accédons à la champs de la structure.
Ouvrages d'art, cependant, ne doivent pas à créer sur la pile.
Tout comme toute autre variable, nous peut dynamiquement les attribuer.
Si nous avons un programme qui pourrait être générer de nombreuses structures,
nous ne savons pas combien de nous allons avoir besoin,
alors nous devons dynamiquement répartir ces structures
que notre programme est en cours d'exécution.
Et donc si nous allons accéder à la les champs d'une structure dans ce contexte,
Rappelons que nous avons d'abord besoin de déréférencer le pointeur vers la structure,
puis une fois que nous l'déréférencer pointeur, alors nous pouvons accéder aux champs.
Si nous avons seulement un pointeur vers la structure,
nous ne pouvons pas simplement dire champ pointeur de la dot Nom et obtenons ce que nous recherchons.
Il ya l'étape supplémentaire de déréférencement.
Donc disons que au lieu de la previous--
tout comme l'exemple précédent, au lieu de le déclarer
sur la pile, voiture struct, mon voiture, point-virgule, je dis voiture de struct,
étoiles, un pointeur vers une voiture de struct appelé ma voiture,
est égal à la taille de la voiture de malloc struct.
Taille de nous va déterminer combien de octets votre nouveau type de données prend.
Nécessairement que vous ne devez utiliser taille de largeur, int ou char, ou tout
des types de données intégrés.
Le compilateur est assez intelligent de comprendre comment de nombreux octets
sont requis par votre nouvelle structure.
Alors je me suis malloc une unité de mémoire assez grand pour contenir une voiture de struct,
et je reçois un pointeur de retour à ce bloc de mémoire,
et ce pointeur est assigné à ma voiture.
>> Maintenant, si je veux un accès les domaines de ma voiture,
Je premier déréférencer ma voiture à l'aide l'opérateur de déréférencement, étoile
que nous avons vu des pointeurs vidéos, et puis après je déréférencer,
alors je peux utiliser l'opérateur point pour accéder aux différents domaines de ma voiture.
Étoile ma voiture dot année est égal à 2,011.
Cela aurait l'effet nous voulons dans ce cas,
Parce que nous avons dynamiquement alloué ma voiture.
>> Voilà assez ennuyeux, bien, non?
Il ya un processus en 2 étapes maintenant.
Maintenant, nous devons dereference-- nous avons un opérateur étoiles,
et nous avons un opérateur point.
Et comme on pouvait s'y attendre, parce C programmeurs aiment façons plus courtes
de faire les choses, il ya une chemin plus court pour ce faire.
Il ya un autre opérateur appelé flèche, ce qui rend ce processus beaucoup plus facile.
La façon dont fonctionne flèche est il premiers déréférences
le pointeur sur la gauche côté de l'opérateur,
puis, après avoir déréférencé le pointeur sur la gauche,
il accède au champ sur la droite.
Et si auparavant nous avions ce genre de Star ma voiture dot tous ces trucs,
comme il y avait beaucoup de choses là-bas.
Mais ce que nous pouvons faire est de la place this-- ma voiture flèche année équivaut à 2,011.
>> Encore une fois, ce qui se passe ici?
Premièrement, je suis déréférencement ma voiture.
Qui encore une fois, est un pointeur ici.
Puis, après avoir déréférencé ma voiture, je
peut alors accéder aux champs année, plaque, et le compteur kilométrique
tout comme je pouvais avant d'avoir d'abord étoiles occasion de déréférencer ma voiture,
et parsemer pour accéder au champ.
Ainsi, vous pouvez avoir des structures, vous peut avoir des pointeurs vers des structures,
et vous avez les moyens d'accès les champs de ces structures,
si vous avez des pointeurs vers ou les variables elles-mêmes.
Dot ou une flèche, selon comment la variable a été déclarée.
Je suis Doug Lloyd, cela est CS50.