Les tableaux et les pointeurs en C ++

Le nom du tableau est un pointeur vers le tableau lui-même. La tableau est une séquence de variables stockées dans la mémoire. La nom du tableau des points sur le premier élément.

Ceci est une question intéressante à propos des pointeurs: Pouvez-vous avoir un en-tête de fonction, comme la ligne suivante, et il suffit d'utiliser taille de pour déterminer le nombre d'éléments présents dans le tableau? Si oui, cette fonction ne serait pas besoin d'avoir l'appelant de spécifier la taille de la matrice.

int AddUp (int Numbers []) {

Considérez cette fonction trouvé dans le Array01 et un exemple main () qu'il invoque:

annuler ProcessArray (Nombres int []) {cout lt; lt; "Fonction à l'intérieur: Taille en octets est" lt; lt; sizeof (Nombres) lt; lt; endl-} int main (int argc, char * argv []) {int MyNumbers [] = {} -cout 1,2,3,4,5,6,7,8,9,10 lt; lt; "Fonction à l'extérieur: Taille en octets est" -cout lt; lt; sizeof (MyNumbers) lt; lt; endl-ProcessArray (MyNumbers) -Retour 0-}

Lorsque vous exécutez cette application, voici ce que vous voyez:

Fonction à l'extérieur: Taille en octets est fonction 40Inside: Taille en octets est 4

En dehors de la fonction, le code sait que la taille de la matrice est de 40 octets. Mais pourquoi ne le code pense que la taille est de 4 après qu'il est à l'intérieur du tableau? La raison en est que, même si il semble que vous êtes en passant un tableau, vous êtes vraiment passer un aiguille à un tableau. La taille du pointeur est à seulement 4, et que ce qui est la finale cout gravures de ligne.

La déclaration de tableaux a un léger idiosyncrasie. Lorsque vous déclarez un tableau en donnant un nombre défini d'éléments, tels que

MyNumbers int [5] -

le compilateur sait que vous avez un tableau, et la taille de l'opérateur vous donne la taille de l'ensemble du réseau. Le nom de tableau, alors, est les deux un pointeur et un tableau! Mais si vous déclarez un en-tête d'une fonction sans une taille de tableau, comme

annulera ProcessArray (int Numbers []) {



les compilateur traite cela comme un simple aiguille et rien de plus. Cette dernière ligne est, en fait, équivalent à la ligne suivante:

annuler ProcessArray (* Numéros int) {

Ainsi, à l'intérieur des fonctions qui soit ligne déclare, les deux lignes de code suivantes sont équivalent:

Numbers [3] = 10 - * (numéros + 3) = 10

Cette équivalence signifie que si vous utilisez un externe déclaration sur un tableau, comme

extern int MyNumbers [-]

puis prendre la taille de ce tableau, le compilateur se confondre. Voici un exemple: Si vous avez deux fichiers, numbers.cpp et main.cpp, où numbers.cpp déclare un tableau et main.cpp il se déclare à l'extérieur (comme représenté sur la Array02 par exemple), vous obtiendrez une erreur de compilation si vous appelez taille de:

#comprendre using namespace std-externe MyNumbers int [] - int main (int argc, char * argv []) {cout lt; lt; sizeof (MyNumbers) lt; lt; endl-retour 0-}

Dans le code de blocs, le compilateur gcc nous donne cette erreur:

erreur: application invalide de «sizeof» sur un type incomplet 'int []'

La solution est de mettre la taille du tableau entre crochets. Assurez-vous que la taille est la même que dans l'autre fichier de code source! Vous pouvez simuler le compilateur en changeant le nombre, et vous ne sera pas obtenir une erreur. Mais cela est mauvais style de programmation et juste demander pour les erreurs.

Bien qu'un tableau est tout simplement une séquence de toutes les variables adjacentes l'une à l'autre dans la mémoire, la nom d'un tableau est vraiment juste un pointeur vers le premier élément du tableau. Vous pouvez utiliser le nom comme un pointeur. Cependant, le faire que quand vous avez vraiment besoin de travailler avec un pointeur. Après tout, vous avez vraiment aucune raison d'écrire du code qui est énigmatique, comme * (Nombres + 3) = 10.

L'inverse est également vrai. Regardez cette fonction:

annuler ProcessArray (int * Numbers) {cout lt; lt; Numbers [1] lt; lt; endl-}

Cette fonction prend un pointeur comme un paramètre, mais vous y accédez comme un tableau. Encore une fois, ne pas écrire du code comme this- lieu, vous devez comprendre pourquoi code comme ceci fonctionne. De cette façon, vous gagnez une connaissance approfondie des réseaux et comment ils vivent à l'intérieur de l'ordinateur, et cette connaissance, à son tour, peut vous aider à écrire du code qui fonctionne correctement.

Même si, le nom du tableau est juste un pointeur, le nom d'un tableau d'entiers est pas exactement la même chose comme un pointeur sur un entier. Découvrez ces lignes de code (qui se trouve dans le Array03 exemple):

int LotsONumbers [50] -int x-LotsONumbers = X-

Pointez la LotsONumbersaiguille à quelque chose de différent: quelque chose déclaré comme un entier. Le compilateur ne laissez pas vous ne this- vous obtenez une erreur. Ce ne serait pas le cas si LotsONumbers ont été déclarés int * LotsONumbers- alors ce code fonctionne. Mais comme il est écrit, ce code vous donne une erreur de compilation. Et croyez-le ou non, voici l'erreur de compilation que vous obtenez dans le code de blocs:

erreur: types incompatibles dans l'affectation de «int *» à «int [50]»

Cette erreur implique le compilateur ne voit une nette distinction entre les deux types, int * et int []. Néanmoins, le nom du tableau est en effet un pointeur, et vous pouvez l'utiliser comme de un vous ne pouvez pas tout faire avec ce que vous pouvez avec un pointeur normal, comme le réaffecter.

Lors de l'utilisation des tableaux, puis, notez les conseils suivants. Ils vous aideront à garder vos réseaux sans bug:

  • Gardez votre code cohérent. Si vous déclarez, par exemple, un pointeur vers un entier, ne le traitez pas comme un tableau.

  • Gardez votre code clair et compréhensible. Si vous passez des pointeurs, il est normal de prendre l'adresse du premier élément, comme dans (MyNumbers [0]) si cela rend le code plus clair - même si elle est équivalente à juste MyNumbers.

  • Lorsque vous déclarez un tableau, toujours essayer de mettre un certain nombre à l'intérieur des crochets, sauf si vous écrivez une fonction qui prend un tableau.

  • Lorsque vous utilisez le externe mot-clé pour déclarer un tableau, aller de l'avant et a également mis la taille du tableau entre parenthèses à l'intérieur. Mais être cohérent! Ne pas utiliser un numéro un temps et un nombre différent un autre temps. La meilleure façon d'être cohérent est d'utiliser une constante, comme const int ArraySize = 10 dans un fichier d'en-tête commune et ensuite l'utiliser dans votre déclaration de tableau: int MonTableau [ArraySize] -.


» » » » Les tableaux et les pointeurs en C ++