7
votes

Tableaux et pointeurs de deux dimensions

J'ai l'extrait de code suivant:

char board[3][3] = {
                     {'1','2','3'},
                     {'4','5','6'},
                     {'7','8','9'}
                   };

printf("address of board : %p\n", &board);
printf("address of board[0] : %p\n", &board[0]);


0 commentaires

4 Réponses :


1
votes

Selon mes connaissances, le nom du tableau (i.e) tableau représente l'adresse du premier étagère (i.e) carte [0] p>

Ceci est seulement vrai si carte code> est utilisé en dehors de ces contextes p>

  • comme opérande de l'opérateur & code> li>
  • comme opérande de tailleof code> li> ul>

    Lorsque l'une de celle-ci s'applique, expression carte code> représente le tableau et conserve le type de la matrice ( Char [3] [3] code>). Appliquer l'opérateur & CODE> Il en résulte obtenir l'adresse de la matrice, ce qui est bien sûr égal à l'adresse de son premier élément, simplement ayant un type différent ( char (*) [3] [3] [ 3] code> au lieu de char (*) [3] code>). La même chose qui est vraie à propos de la carte code> code> est vraie à propos de son premier sous-tableau carte [0] code>. P>

    Lorsque vous l'utilisez en dehors de ces contextes, vous obtenez l'adresse du premier élément (sous-carré dans votre cas). Cette adresse n'est pas un objet mais juste une valeur. La valeur n'a pas d'adresse, mais les objets ont. Essayer d'appliquer & code> dessus échouerait. Par exemple, P>

    // error: trying to apply '&' on something that has no address
    &(1 ? board : board)
    


2 commentaires

Bonjour merci pour votre réponse et je comprends partiellement. Pouvez-vous fournir un programme d'échantillon simple expliquant votre commentaire. Je serais d'une grande aide. Merci.


@intex Votre question est le programme d'exemple simple que je fournirais.



5
votes

Bien que ce soit un tableau 2D, à l'intérieur de la mémoire, il sera représenté comme une matrice linéaire. Donc, lorsque vous dites, le tableau [0] [0] indique toujours le premier élément de cette matrice linéaire et donc la même adresse mémoire.


0 commentaires

1
votes

Bien sûr, cela imprimera la même adresse.
Pensez à des tableaux 2D comme celui-ci pendant une minute,

int ** ptr;


L'adresse * pTR est égale & (** ptr) .

Parce que fondamentalement, c'est ce que votre code fait.

Et rappelez-vous que dans la mémoire, les matrices 2D seront mappées de manière linéaire.


0 commentaires

1
votes

Il est peut-être le cas que vous connaissez une langue orientée objet telle que Java ou Python, et vous apprenez maintenant le langage C. La différence entre Java et C lorsque vous réfléchissez à Char Board [3] [3] est que dans c la variable la variable est représenté en mémoire sous 9 caractères à des adresses de mémoire adjacentes. Comme: xxx

in c, & board donne la même adresse mémoire que et carte [0] et et [0] .

Contrairement à cela, en Java, la variable serait déclarée sous forme char [] [] carte et sa représentation de mémoire ressemblerait à cette question : xxx

pTR (x) pointe vers l'adresse de la mémoire de x . Donc, dans Java, Pointe Pointe à une adresse de mémoire différente de celle de [0] .


Vous dites en C, et le tableau donne la même adresse mémoire que et la carte [0] et et la carte [0] [0]. Mais je suis capable d'accéder au premier élément uniquement via la carte [0] [0] (ou) * carte [0] (ou) ** Conseil. Pourquoi est-ce tellement ??

Bien que les expressions & Board et et boat [0] et et boat [0] [0] donnent la même adresse, Le système de type du langage C vous empêche d'accéder à la valeur Char . Dans un compilateur C, les types sont (conceptuellement): xxx

supposant une variable de type char , nous pouvons écrire: < pré> xxx

mais ne peut pas écrire: xxx

car le type sur le côté gauche est incompatible avec le type sur le côté droit de l'affectation. < / p>

Si vous êtes sûr qu'un point d'adresse indique à un char , vous pouvez utiliser un type de déclenchement: xxx

l'inconvénient est que de tels castings de type peuvent conduire à des bugs codants.


1 commentaires

Vous dites en C, et le tableau donne la même adresse mémoire que et la carte [0] and & board [0] [0]. Mais je suis capable d'accéder au premier élément uniquement via la carte [0] [0] (ou) * carte [0] (ou) ** Conseil. Pourquoi est-ce tellement ??