7
votes

* (A ++) donne une erreur mais pas * (A + 1) ?? où a est le nom du tableau?

Dans le code suivant:

void main()
{
    char a[]={1,5,3,4,5,6};
    printf("%d\n",*(a++)); //line gives error: wrong type argument to increment
    printf("%d\n",*(a+1));
}


2 commentaires

Je ne suis pas bon en C, mais vous ne pouvez peut-être pas double-incrémenter (c'est-à-dire. ++ opérateur) des tableaux.


Complètement hors topique mais void principal () == mauvais! Lorsque vous pensez void principal () , image une personne qui te frappe avec un bâton. Int Main () , toujours!


3 Réponses :


28
votes

A est un objet de tableau et non un pointeur afin que vous ne puissiez pas utiliser l'opération a ++ pour un objet de tableau. Parce que cela équivaut à: xxx

ici, vous attribuez à l'objet tableau une nouvelle valeur qui n'est pas autorisée dans c.

A + 1 Renvoie un pointeur sur l'élément 1 de votre tableau A et c'est autorisé


0 commentaires

3
votes

'A' se comporte comme un pointeur em> const. 'A' ne peut pas changer sa valeur ou l'adresse indiquée. En effet, le compilateur a affecté statiquement la mémoire de taille de la matrice et vous modifiez l'adresse qu'il fait référence à.

Vous pouvez le faire comme suit à la place p>

void main()
{
char a[]={1,5,3,4,5,6};
char *ch;
ch=a;
printf("%d\n",*(ch++)); //this lines gives error no more
printf("%d\n",*(ch+1));
}


3 commentaires

@ H2co3 J'ai dit "supposer" A pour être un pointeur de const. Je n'ai pas appelé cela un cœuteur.


A est la référence de tableau et stocke l'adresse du premier membre de la matrice. Je peux "supposer" en toute sécurité pour être un pointeur de const


Non, tu ne peux pas. En outre, un tableau n'est pas un pointeur. C'est un tableau. Ce n'est pas parce que c'est un pointeur que vous ne pouvez pas vous assigner. C'est parce qu'il est interdit d'attribuer à un tableau. Ce n'est pas obligé d'être const. Ce n'est tout simplement pas un lvalue modifiable.



4
votes

ok malheureusement mauvaises pratiques de codage: Cependant, répondons d'abord à votre problème: xxx

ne peut pas être utilisé car a est une référence implicite à la matrice;

Vous pouvez le faire: xxx

et éteint que vous allez ...

aussi * (A ++) < / code> n'est pas le même que * (A + 1) car ++ tente de modifier OPERAND, tandis que + ajout simplement une à constante < code> une valeur .


1 commentaires

Aussi a ++ est évalué à l'ancienne valeur de A et la valeur stockée de A est incrémentée (postinCrèt)