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]);
4 Réponses :
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)
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 i> le programme d'exemple simple que je fournirais.
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. P>
Bien sûr, cela imprimera la même adresse.
Pensez à des tableaux 2D comme celui-ci pendant une minute, p>
int ** ptr; p> blockQuote>
L'adresse* pTR code> est égale
& (** ptr) code>. P>
Parce que fondamentalement, c'est ce que votre code fait. P>
Et rappelez-vous que dans la mémoire, les matrices 2D seront mappées de manière linéaire. p>
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 à in c, Contrairement à cela, en Java, la variable serait déclarée sous forme où 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 ?? p>
blockQuote> Bien que les expressions supposant une variable de type mais ne peut pas écrire: p> 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 l'inconvénient est que de tels castings de type peuvent conduire à des bugs codants. P> p> Char Board [3] [3] Code> est que dans c la variable code> la variable code> est représenté en mémoire sous 9 caractères à des adresses de mémoire adjacentes. Comme:
& board code> donne la même adresse mémoire que
et carte [0] code> et
et
[0] code>. P>
char [] [] carte code> et sa représentation de mémoire ressemblerait à cette question : p>
pTR (x) code> pointe vers l'adresse de la mémoire de
x code>. Donc, dans Java,
Pointe Code> Pointe à une adresse de mémoire différente de celle de
[0] code>. P>
et boat [0] code> et
et boat [0] [0] code> donnent la même adresse, Le système de type du langage C vous empêche d'accéder à la valeur
Char code>. Dans un compilateur C, les types sont (conceptuellement): p>
char code>, nous pouvons écrire: p> < pré> xxx pré>
char code>, vous pouvez utiliser un type de déclenchement: p>
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 ??