web-dev-qa-db-fra.com

Différence entre * (pointeur + index) et pointeur []

int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];

Existe-t-il une différence fonctionnelle entre *(myPointer + index) et myPointer[index]? Qui est considéré comme une meilleure pratique?

20
Maxpm

Fonctionnellement, ils sont identiques.

Sémantiquement, le pointeur dereference indique "Voici une chose, mais je me soucie vraiment de la chose X espaces sur", tandis que l'accès au tableau indique "Voici un tas de choses, je me soucie de celui Xth."

Dans la plupart des cas, je préférerais la forme tableau.

36
Mike Caron

Il n'y a pas de différence entre

*(array+10); //and
array[10];

mais devinez quoi? puisque + est commutatif

 *(10 + array); //is all the same
 10[array]; //! it's true try it !
21
hhafez

Non, ils sont fonctionnellement équivalents.

Tout d'abord, index est redimensionné à la taille du type puis ajouté à la base myPointer, puis la valeur est extraite de cet emplacement de mémoire.

La "meilleure pratique" est la plus lisible, qui est généralement, mais pas nécessairement, la variante myPointer[index].

C'est parce que vous êtes généralement intéressé par un élément du tableau et non par l'emplacement de mémoire à déréférencer.

12
paxdiablo

Je ne connais aucune différence fonctionnelle, mais le formulaire myPointer[1] est finalement plus lisible et beaucoup moins susceptible de provoquer des erreurs de codage.

DC

Le formulaire *(myPointer + 1) ne permet pas de changer le type de pointeur sur un objet et donc d'accéder à l'opérateur surchargé []. 

Aussi le débogage est beaucoup plus difficile

 int *ints[10];
 int myint = ints[10]; 

est plus facile à récupérer visuellement que

 int *ints;
 int myint = *(ints + 10); 

le compilateur peut également insérer une vérification de plage pour détecter l'erreur au moment de la compilation.

DC

3
DeveloperChris

Un code plus lisible et plus maintenable est un meilleur code.

Quant à la partie fonctionnelle ... Il n'y a pas de différence. Les deux fois, vous "jouez avec la mémoire".

1
Tadas Šubonis

Il n'y a pas de différence fonctionnelle. La décision d'utiliser l'un ou l'autre formulaire est généralement prise en fonction du contexte dans lequel vous l'utilisez. Dans cet exemple, la forme du tableau est plus simple à utiliser et à lire et constitue donc le choix évident. Cependant, supposons que vous traitiez un tableau de caractères, par exemple, que vous utilisiez les mots d'une phrase. Étant donné un pointeur sur le tableau, vous trouverez peut-être plus facile d'utiliser le second formulaire comme dans l'extrait de code ci-dessous:

int parse_line(char* line) 
{
    char* p = line;
    while(*p)
    {
         // consume
         p++;
    }
    ...
}
1
341008

En fait, lorsqu'un tableau 'a' est initialisé, un pointeur sur son premier emplacement de mémoire, c'est-à-dire .. un [0] est renvoyé, ce qui n'est autre qu'un a; 

Donc, si vous faites 'a + 1' c'est en fait un pointeur sur un [1]

si vous faites 'a + 2' c'est en fait un pointeur sur un [2]

si vous faites 'un + 3' c'est en fait un pointeur sur un [3] bientôt ,

donc si vous faites * (a + 1) vous obtiendrez la valeur d'un [1] et similaire pour les autres valeurs aussi . si vous faites * (a) vous obtenez réellement un [0], Donc je pense son assez clair maintenant comment ça marche ..

0
Tushar Gupta