2012-11-24 14 views
1

Voici mon code:Pourquoi est-ce que * pointer + offset ne peut pas être utilisé comme une valeur l? ("Erreur: non-lvalue en cession")

void doubleValuesInArray(int *pointer) { 
    for (int n = 0; n < 2; n++) { 
     int a = (*pointer+n); 
     a = a * 2; 
     *pointer+n = a; 
    } 
} 

int main(int argc, char** argv) { 
    int myArray[] = {1,2}; 
    doubleValuesInArray(myArray); 
    cout<<myArray[0]<<endl; 
    return 0; 
} 

Et la sortie est:

main.cpp: En fonction `vide doubleValuesInArray (int *) ': main.cpp: 19: erreur: non-lvalue dans l'attribution make [2]: * [build/Debug/Cygwin Windows/main.o] erreur 1 make [1]: [.build-conf] Erreur 2 make: * * [.build-impl] Erreur 2

Ma question est:

int a = (*pointer+n); 

fonctionne très bien. La variable 'a' obtient les valeurs 0 et 1 du tableau en utilisant * pointer + n.

Cependant

*pointer+n = a; 

ne semble pas fonctionner.

Si j'utilise pointeur [n] = a; cela fonctionne aussi bien.

Pourquoi ma première approche ne fonctionne-t-elle pas?

+1

Quelqu'un peut-il proposer un meilleur titre pour cette question il peut apparaître dans les recherches? –

Répondre

4

Vous n'avez pas parenthésée vos expressions de pointeur correctement: le * a la priorité, vous devez donc ajouter entre parenthèses autour de l'ajout:

int a = *(pointer+n); 
a = a * 2; 
*(pointer+n) = a; 
+1

Je suggère également de faire 'pointer [n]' pour rendre les choses plus claires. – nos

+1

@nos Utiliser l'opérateur '[]' est vraiment plus propre, et c'est ce que je ferais dans mon code. Cependant, je pense que l'OP voulait savoir spécifiquement sur le déréférencement d'une somme d'un pointeur et d'un index, plutôt que d'utiliser l'option '[]' moins exotique. – dasblinkenlight

3

Il est assez clair - *pointer+n est une valeur r - ce qui signifie que vous ne pouvez pas lui assigner.

Avez-vous dire

*(pointer+n) = a; 

parce que les deux sont différents. *pointer+n renvoie simplement le premier élément du tableau et lui ajoute n (le résultat est une valeur r). *(pointer+n) est le n-ième élément (valeur l).

3

C'est tout à fait faux ce que vous faites. L'opérateur de déréférencement * a une précision supérieure (priorité) à +, donc *pointer + n ajoute n à la valeur pointer points à. Correction:

void doubleValuesInArray(int *pointer) { 
    for (int n = 0; n < 2; n++) { 
     int a = *(pointer+n); 
     a = a * 2; 
     *(pointer+n) = a; 
    } 
} 
Questions connexes