Supposons que j'ai un éventail d'entiers appelés J'ai lu qu'en C ++, merci. p> arr code>. J'essaie de comprendre la distinction entre
* & arr code> et
* & arr [0] code>. p>
Ar code> est essentiellement un pointeur sur le premier élément de la matrice et
& arr code> est un pointeur sur l'ensemble de la matrice. Ils retournent tous les deux la même adresse, je reçois cette partie. Ensuite, si j'entre
* & arr [0] code>, alors le premier élément, c'est-à-dire à
Arr [0] code> est renvoyé. Mais si j'insère
* & arr code>, l'adresse de
arr [0] code> est renvoyée. Ma question est de savoir pourquoi quand j'utilise
* & arr code>, est l'adresse renvoyée, plutôt que le premier élément? La logique dicterait que depuis l'opérateur
* code> renvoie la valeur, on s'attendrait à ce que
* & arr code> pour renvoyer le premier élément au lieu d'une adresse. P>
3 Réponses :
one est une expression J'ai lu qu'en C ++, Jetez ce livre. Il est dangereusement imprécis. Ils renvoient tous les deux la même adresse p>
blockQuote>
mais pas le même type. P>
Ma question est, pourquoi quand j'utilise Parce que vous avez une indemnité de pointe-to-tableau. Si vous utilisez int code>, l'autre est une expression
int [n] code>, pour une taille
n code>. p>.
arr code> est essentiellement un pointeur p>
blockQuote>
ARR CODE> peut convertir en un pointeur à un moment de préavis, mais il est le plus clairement pas un pointeur. P>
* & arr code> est l'adresse renvoyée, plutôt que le premier élément? p>
blockQuote>
* & arr code> dans un contexte qui attend un pointeur, il se désintègre à un, comme toute autre expression de tableau. P>
J'ai lu qu'en C ++,
arr code> est essentiellement un pointeur sur le premier élément de la matrice p> blockQuote>
C'est faux. Si
ARR code> est un tableau, il s'agit d'un tableau. Les tableaux ne sont pas des pointeurs 1 sup>. P>
Pourquoi quand j'utilise * & ARR, est l'adresse renvoyée p> blockQuote>
étant donné que
& arr [0] code> est un pointeur sur le premier élément, indirectant via le pointeur (
* & arr [0] code>) vous donne une référence de lvalue au premier élément. p>
étant donné que
& arr code> est un pointeur sur la matrice, indirectant via le pointeur (
* & arr code>) vous donne une référence de LValue à la matrice. Juste comme
arr code>, ce réseau LValue décrit à un pointeur au premier élément lorsqu'il est converti en rvalue. P>
Sauf pour les cas où les opérateurs sont surchargés,
* & code> s'annulent essentiellement. Ce sont des opérations inverse.
* & arr [0] code> vous donne la même chose que
arr [0] code> et
* & arr code> vous donne la même chose que
ARR code >. P>
1 sup> sauf dans la déclaration de fonctions Partmètres, où un paramètre de matrice ne déclare pas du tout un tableau, mais plutôt un pointeur à l'élément de ce tableau. P>
• NIT: Déclaration d'une fonction et de ses paramètres i>. Les arguments sont ce que les procédés passent en fonctions.
@Eljay Je n'ai jamais pu apprendre, ce qui est lequel :) particulièrement déroutant car ils sont également parfois appelés arguments / paramètres formels "et argument / paramètre" réel "dans quel contexte ils sont synonymes.
J'ai finalement utilisé que les arguments mnémoniques "sont comme des automobiles et des paramètres sont comme des taches de stationnement".
J'ai lu qu'en C ++,
arr code> est essentiellement un pointeur sur le premier élément de la matrice p> blockQuote>
Alors tout ce que vous lisez est faux. Il est vrai que les matrices se décomposeront dans un pointeur sur leur premier élément si vous les regardez mal, mais
Les tableaux ne sont pas des pointeurs forts>. P>.
Ça hors de la route: P>
* & arr code> donne l'ensemble de la matrice.
& ARR CODE> forme un pointeur sur le tableau et
* code> DÉRÉFERFERENCES que le pointeur. Ainsi, le type de cette expression est identique à celui
arr code>. Encore une fois, cela se décomposera dans un pointeur sur le premier élément de la matrice si vous le regardez mal. Par exemple, si vous essayez d'imprimer cela avec
std :: COUT << * & ARR CODE>, le tableau décédera à un pointeur sur son premier élément et finissez probablement à appeler l'opérateur
<< (STD :: Ostream &, void *) Code> Surcharge. P> LI>
* & arr [0] code> donne le premier élément de la matrice.
arr [0] code> Index dans la matrice,
& code> forme un pointeur sur le premier élément de la matrice, puis
* code> Déroférences que le pointeur. Le type de cette expression est le même que
arr [0] code>. P> li> ul>
Pourquoi vous attendez-vous au
* & arr code> pour renvoyer le premier élément?
* code> et
& code> s'annulent sur l'autre, donc
* & arr [0] code> est equlivalent à
arr [0] code>, et
* & arr code> est équivalent à
Art code>.
Peut-être devriez-vous démontrer ce dont vous parlez avec un exemple de reproductible minimal (donc nous avons une signification précise pour "si J'entre ", comme nous ne savons pas où vous entrez des choses)? Définissez
Ar code>, puis sortie
* & arr [0] code> et
* & arr compte>. Pendant que vous êtes à cela, émettez également
arr [0] Arr [0] code> et
Arr code> et expliquez pourquoi vous attendez
* & arr [0] code> pour correspondre
Arr [0] code> mais ne vous attendez pas à
* & arr code> pour correspondre
Ar code>.
L'opérateur
* code> donne une expression de lvalue, qui désigne un emplacement de mémoire. Il ne récupère pas la valeur stockée de cet emplacement (cette opération s'appelle l'aversion LValue-to-RValue)