[Powered by Google Translate] Parlons un peu de tableaux.
Alors, pourquoi aurions-nous jamais eu envie d'utiliser des tableaux?
Eh bien, disons que vous avez un programme qui a besoin de stocker 5 cartes d'étudiant.
Il pourrait sembler raisonnable d'avoir 5 variables séparées.
Pour des raisons que nous verrons dans un instant, nous allons commencer à compter à partir de 0.
Les variables que nous aurons sera id0 int, int id1, et ainsi de suite.
Toute la logique que nous voulons réaliser sur une carte d'étudiant devront être copiées et collées
pour chacune de ces cartes d'étudiant.
Si nous voulons vérifier que les élèves se trouvent dans CS50,
nous devons d'abord vérifier si id0 représente l'étudiant dans le cours.
Puis faire la même chose pour l'élève suivant, nous aurons besoin de copier et coller le code id0
et remplacer toutes les occurrences de id0 avec id1 et id2 ainsi de suite pour, 3 et 4.
>> Dès que vous entendez ce que nous avons besoin de copier-coller,
vous devriez commencer à penser qu'il ya une meilleure solution.
Maintenant, si vous vous rendez compte que vous n'avez pas besoin de 5 cartes d'étudiant, mais plutôt 7?
Vous devez retourner dans votre code source et d'ajouter dans un id5, un id6,
et copier et coller la logique de vérifier si les identifiants appartiennent à la classe pour ces 2 nouveaux identifiants.
Il n'y a rien qui relie tous ces identifiants ensemble, et il n'y a donc aucun moyen de demander
le programme de le faire pour les ID 0 à 6.
Eh bien maintenant vous vous rendez compte que vous avez 100 cartes d'étudiant.
Ça commence à paraître moins qu'idéal à déclarer séparément besoin de chacun de ces identifiants,
et copier et coller toute logique pour les nouvelles cartes d'identité.
Mais peut-être que nous sommes déterminés, et nous le faisons pour tous les 100 élèves.
Mais que faire si vous ne savez pas combien d'étudiants il ya effectivement?
Il ya juste quelques élèves n et votre programme doit demander à l'utilisateur ce qui n est.
Uh oh. Cela ne va pas très bien fonctionner.
Votre programme ne fonctionne que pour un certain nombre constant d'étudiants.
>> Résoudre tous ces problèmes, c'est la beauté des tableaux.
Alors qu'est-ce qu'un tableau?
Dans certains langages de programmation de type tableau peut être capable de faire un peu plus,
mais ici nous allons nous concentrer sur la baie de la structure de données de base comme vous le verrez dans C.
Un tableau est juste un gros bloc de mémoire. C'est tout.
Quand nous disons que nous avons un tableau de 10 entiers, cela signifie simplement que nous avons un certain bloc
de mémoire qui est assez grand pour contenir 10 entiers distincts.
En supposant qu'un nombre entier de 4 octets, ce qui signifie que un tableau de 10 entiers
est un bloc continu de 40 octets dans la mémoire.
Même lorsque vous utilisez les tableaux multidimensionnels, qui nous n'aborderons pas ici, pour
elle est encore juste un gros bloc de mémoire.
La notation multidimensionnel est juste une commodité.
Si vous avez un 3 par 3 tableau multidimensionnel des nombres entiers,
alors votre programme sera vraiment juste traiter cela comme un gros bloc de 36 octets.
Le nombre total de nombres entiers est 3 fois 3, et chaque entier prend 4 octets.
>> Jetons un coup d'oeil à un exemple de base.
Nous pouvons voir ici 2 façons différentes de tableaux déclarant.
Nous allons devoir faire des commentaires 1 d'entre eux pour le programme à compiler
puisque nous déclarons deux fois sur x.
Nous allons jeter un oeil à quelques-unes des différences entre ces 2 types de déclarations en un peu.
Ces deux lignes de déclarer un tableau de taille N,
où nous avons # define N par 10.
Nous pourrions tout aussi bien pu demander à l'utilisateur un nombre entier positif
et utilisé que comme un nombre entier nombre d'éléments dans la matrice.
Comme notre exemple d'étudiant avant, c'est un peu comme déclarer 10 complètement séparée
les variables imaginaires; x0, x1, x2, et ainsi de suite jusqu'à xN-1.
Ignorant les lignes où nous déclarer le tableau, notez les crochets intacte
à l'intérieur de la boucle pour.
Quand nous écrire quelque chose comme x [3], que je vais lire comme support x 3,
vous pouvez penser que c'est comme demander l'imaginaire x3.
Notez qu'avec un tableau de taille N, cela signifie que le nombre à l'intérieur des parenthèses,
que nous appellerons l'indice, peut être n'importe quoi allant de 0 à N-1,
soit un total de N indices.
>> Pour réfléchir à la façon dont cela fonctionne réellement
rappelez-vous que le tableau est un gros bloc de mémoire.
En supposant qu'un nombre entier de 4 octets, le tableau entier x est un bloc de 40 octets de mémoire.
Alors x0 désigne les 4 premiers octets du bloc.
X [1] désigne les 4 octets suivants et ainsi de suite.
Cela signifie que le début de x est d'autant programme jamais besoin de garder la trace.
Si vous souhaitez utiliser x [400], le programme sait que c'est équivalent
à seulement 1.600 octets après le début de x.
Où as on obtient à partir de 1600 octets? Il est à seulement 400 fois 4 octets par entier.
>> Avant de poursuivre, il est très important de réaliser que dans C
il n'y a pas l'application de l'indice que nous utilisons dans le tableau.
Notre gros bloc est à seulement 10 entiers long, mais rien ne nous crier dessus si nous écrivons x [20]
ou encore x [-5].
L'indice n'a même pas besoin d'être un numéro.
Il peut être n'importe quelle expression.
Dans le programme, nous utilisons la variable i de la boucle for à l'index dans le tableau.
Il s'agit d'un modèle très courant, en boucle de i = 0 à la longueur du tableau,
et puis je utiliser comme index de la matrice.
De cette façon, vous avez effectivement une boucle sur l'ensemble du réseau,
et vous pouvez soit assigner à chaque point dans le tableau ou l'utiliser pour des calculs.
>> Dans la première boucle for, i commence à 0,
et il se verra attribuer le 0 dans le tableau, la valeur 0 fois 2.
Alors je incréments, et nous attribuons la première place dans le tableau de la valeur 1 fois 2.
Alors je incréments de nouveau et ainsi de suite jusqu'à ce que nous attribuons à la position N-1 dans le tableau
la valeur N-1 fois 2.
Nous avons donc créé un tableau avec les 10 premiers nombres pairs.
Unifie Peut-être aurait été un peu mieux le nom de la variable que x,
mais qui aurait donné les choses.
La deuxième boucle for, affiche seulement les valeurs que nous avons déjà stockés à l'intérieur de la matrice.
>> Essayons d'exécuter le programme avec les deux types de déclarations de tableau
et jeter un oeil à la sortie du programme.
Autant que nous pouvons le constater, le programme se comporte de la même façon pour les deux types de déclarations.
Nous allons également jeter un oeil à ce qui se passe si nous changeons la première boucle de ne pas s'arrêter à N
mais plutôt dire 10.000.
Bien au-delà de la fin du tableau.
Oops. Peut-être que vous avez vu cela auparavant.
Une erreur de segmentation signifie que votre programme a planté.
Vous commencez à voir lorsque vous touchez ces zones de mémoire vous ne devriez pas être touchant.
Ici, nous touchons 10.000 places au-delà du début de x,
ce qui est évidemment une place dans la mémoire il ne faut pas se toucher.
Ainsi, la plupart d'entre nous ne serait probablement pas accidentellement mettre 10.000 au lieu de N,
mais que faire si nous faisons quelque chose de plus subtil comme, disons, écriture inférieur ou égal à N
dans la condition de boucle pour, par opposition à moins de N.
Rappeler que un tableau des indices seulement de 0 à N-1,
ce qui signifie que l'indice N est au-delà de l'extrémité de la rangée.
Le programme pourrait ne pas s'écraser dans ce cas, mais c'est toujours une erreur.
En fait, cette erreur est si commun qu'il a son propre nom,
un arrêt de 1 erreur.
>> C'est tout pour les bases.
Alors, quelles sont les principales différences entre les 2 types de déclarations de tableau?
Une différence est où le grand bloc de mémoire va.
Dans la première déclaration, que je vais appeler le type d'étrier tableau,
si ce n'est en aucun cas un nom conventionnel,
il ira sur la pile.
Alors que dans le second, que je vais appeler le type de pointeur de tableau, il ira sur le tas.
Cela signifie que lorsque la fonction retourne, le réseau de support sera automatiquement libérée,
alors que vous devez appeler explicitement en libre sur le tableau de pointeurs
ou bien vous avez une fuite de mémoire.
En outre, le réseau de support n'est pas réellement une variable.
Ceci est important. C'est juste un symbole.
Vous pouvez penser que c'est une constante que le compilateur choisit pour vous.
Cela signifie que nous ne pouvons pas faire quelque chose comme x + + avec le type de support,
si cela est parfaitement valide avec le type de pointeur.
>> Le type de pointeur est une variable.
Pour le type de pointeur, nous avons 2 blocs distincts de mémoire.
La variable x est elle-même stockée dans la pile et est juste un seul pointeur,
mais le grand bloc de mémoire est stocké sur le tas.
La variable x sur la pile stocke simplement l'adresse
du grand bloc de mémoire sur le tas.
Une des conséquences de cela est de la taille de l'opérateur.
Si vous demandez la taille de la matrice de support, il vous donnera la taille du gros bloc de mémoire,
quelque chose comme 40 octets,
mais si vous demandez à la taille du type pointeur de tableau,
il vous donnera la taille de la variable x elle-même, l'appareil est susceptible seulement 4 octets.
En utilisant le type de pointeur de tableau, il est impossible de demander directement
la taille de la mémoire de bloc de grande taille.
Ce n'est généralement pas beaucoup d'une restriction puisque nous voulons que très rarement la taille
du grand bloc de mémoire, et on peut généralement le calculer si nous en avons besoin.
>> Enfin, le tableau support qui arrive à nous fournir un raccourci pour initialiser un tableau.
Voyons comment nous pourrions écrire les 10 premiers entiers pairs en utilisant le raccourci initilization.
Avec le tableau de pointeurs, il n'y a pas moyen de faire un raccourci de ce genre.
Ceci est juste une introduction à ce que vous pouvez faire avec les tableaux.
Ils apparaissent dans presque tous les programmes que vous écrivez.
J'espère que vous pouvez maintenant voir une meilleure façon de faire l'exemple des étudiants ID
dès le début de la vidéo.
>> Mon nom est Rob Bowden, et c'est CS50.