2010-09-29 3 views
3

De mes diapositives de cours, il est écrit:En C, pourquoi une référence de tableau a + = 2; code invalide

Comme cela est illustré dans le code ci-dessous un nom de tableau peut être attribué à un
pointeur approprié sans la nécessité d'un opérateur & précédent.

int x; 
int a[3] = {0,1,2}; 
int *pa = a; 
x = *pa; 
x = *(pa + 1); 
x = *(pa + 2); 
a += 2; /* invalid */ 

Pourquoi a += 2; est-il invalide?

Quelqu'un peut-il aider à clarifier?
N'hésitez pas à modifier le titre si vous en pensez un meilleur.

+0

Merci Peter, j'aurais dû remarquer la fonction de bloc de code. –

+1

duplication possible de [Arithmétique et tableaux de pointeurs: qu'est-ce qui est vraiment légal?] (Http://stackoverflow.com/questions/2383837/pointer-arithmetic-and-arrays-whats-really-legal), [Les pointeurs et les tableaux sont-ils différents? en C?] (http://stackoverflow.com/questions/1054247/are-pointers-and-arrays-any-different-in-c), et plus encore. –

+0

Désolé, je n'avais aucune idée de ce que les termes de recherche à utiliser. –

Répondre

8

a += 2 obtient traduit a = a + 2. Ajouter un nombre à un tableau équivaut à ajouter un nombre à un pointeur valide et donner un nouveau pointeur. L'affectation est le problème - les tableaux ne sont pas des lvalues, donc vous ne pouvez rien leur assigner. Ce n'est juste pas autorisé. Et même si vous pouviez y avoir une incompatibilité de type ici - vous essayez d'assigner un pointeur à un tableau qui n'a pas de sens.

+0

Merci, vous avez répondu clairement et précisément à ma question. Cependant, je souhaite maintenant je me suis souvenu/(a ​​été enseigné) ce que les valeurs étaient. Je crois que ma confusion était que les tableaux étaient des pointeurs vers la première valeur. –

+0

Une lvalue est fondamentalement quelque chose qui peut être sur le côté gauche d'une déclaration d'affectation (l pour gauche). Donc, fondamentalement, les variables (sauf les tableaux), les déréférences de pointeurs (* ptr), l'accès aux éléments de tableau (array [index]) et l'accès au champ struct (str.field ou ptr-> field) sont des valeurs lvalues. – Sven

+3

@Sven: En fait, il s'agit d'une lvalue, mais que vous ne pouvez pas affecter. 6.3.2.1/1, "Une lvalue modi fi able est une lvalue qui n'a pas de type tableau, n'a pas de type incomplet, n'a pas de type const-quali fi é, et si elle est une structure ou une union, n'a aucun membre (y compris, de façon récursive, tout élément ou élément de contenant tous des agrégats ou unions) avec un type const-quali fi é ". On peut soutenir que le terme "lvalue" est donc une terminologie trompeuse, car il y a des valeurs qui ne peuvent pas être les lhs d'une assignation. C++ 0x "clarifie" le problème en introduisant plusieurs nouveaux types d'expression ;-) –

7

a += 2; est invalide car l'opérateur += n'est pas défini pour les tableaux. De plus, les tableaux ne sont pas modifiables. Vous ne pouvez donc pas les affecter.

2

Lorsque vous passez un à une fonction où un pointeur est attendu, l'adresse de a est utilisée. Cela conduit à la mauvaise déclaration, un tableau et un pointeur sont interchangeables.

Mais

  • un est un tableau
  • pa est un pointeur

Comme pa est un scalaire, vous pouvez le modifier avec

pa = pa + 2; 

ou

pa += 2; 

Le tableau a ne définit aucune opération comme

a = a + 2; /* invalid */ 
0

lorsque vous écrivez un + = 2 alors il traduit à a = a + 2.

Donc cela signifie que vous modifiez l'adresse de base du tableau. Cela n'est pas autorisé dans c car si vous modifiez l'adresse de base du tableau, alors comment accéder à l'élément de tableau.

Il donnera Lvalue erreur requise au moment de la compilation.

Questions connexes