Tableaux et pointeurs C++

Kaushal

Pourquoi la variable pointeur peut être affectée de valeur mais pas la variable tableau ? En d'autres termes, pourquoi la déclaration 4 est illégale est-elle inférieure à l'extrait de code ?

1.int a[10];
2.int *p; 
3.p=a;     //legal operation
4.a=p;    // Illegal operation
luk32

Il y a une raison pour laquelle votre affirmation 3. est appelée pourriture . La conversion est à sens unique, car les pointeurs et les tableaux ne sont pas les mêmes.

Lorsque le tableau se décompose en un pointeur, il perd des informations sur sa taille. Il ne peut pas être récupéré, donc la conversion inverse ne peut pas être effectuée implicitement. C'est-à-dire int[WHAT]devrait-il reconvertir?

Deux différences principales du haut de ma tête:

  1. Si vous vérifiez aqu'il contient des informations sur sa taille, le pointeur ne le fait pas. Vérifiez sizeof(a), sizeof(p)et sizeof(*p).

  2. a garantit que certains éléments sont là (c++ interdit les tableaux de taille nulle).

Mais il est logique de traiter pcomme un tableau de type non liédecltype(p) dans certains contextes. En particulier, le placement des éléments est facile à calculer le placement d'un élément donné en mémoire. C'est la même chose que l'arithmétique du pointeur. C'est pourquoi la notation est la même, par exemple les deux p[6]et le a[6]travail. Ainsi, les fonctions acceptant des tableaux peuvent accepter des tableaux de tailles arbitraires.

Mais ce n'est pas pareil.

Les différences deviennent apparentes lorsque vous ajoutez une autre dimension. Avec un tableau (taille fixe), vous pouvez calculer arithmétiquement le placement de l'élément comme ci-dessus, il est contigu en mémoire et vous connaissez la taille de chaque "ligne".

Mais int**vous avez deux niveaux dont vous ne connaissez pas les limites. C'est-à-dire que vous n'êtes pas en mesure de calculer arithmétiquement la position de l'élément dans int**vous devez résoudre le 1er niveau, puis utiliser le calcul. Chaque "ligne" peut avoir une longueur différente.

C'est pourquoi vous obtenez des erreurs du type :

main.cpp:11:8 : erreur : impossible de convertir 'int**' en 'int ( )[5]' pour l'argument '1' en 'void f(int ( )[5])'

Notez que la 1ère dimension a été convertie en un pointeur, mais vous ne pouvez délier le tableau que sur une dimension (par convention, c'est la 1ère) !

Voir http://coliru.stacked-crooked.com/a/5063a9d19739278a :

void f(int a[3][5]){}

int main() {
    int ** p = new int*;
    int b[4][5]; // works because 1st dimension can decay to pointer (unbound array)
    int c[3][6]; // doesn't work because 2st dimension cannot decay to pointer
    f(p); f(b); f(c);
    return 0;
}

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Comment insérer une valeur de variable dans la formule getpivotdata à l'aide de la macro Excel VBA

  2. 2

    Des résultats inattendus dans les discussions Java multi-malgré les verrous

  3. 3

    Comment appliquer un effet de flou sur une barre de navigation en css

  4. 4

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  5. 5

    Comment puis-je faire fonctionner un effet de verre / flou CSS pour une superposition?

  6. 6

    Comment supprimer des mots d'un fichier texte en Python qui contiennent certaines lettres ?

  7. 7

    ERREUR 1054 (42S22): colonne inconnue 'marque' dans 'liste de champs'

  8. 8

    La connexion du conteneur FTP fonctionne avec docker-compose et non avec docker run

  9. 9

    Définir des URL pour la redirection vers une URL spécifique sans réécriture

  10. 10

    Pandas - Remplacer la valeur de ligne du calcul dérivé

  11. 11

    L'abonnement Python du kit AWS IoT SDK renvoie true mais le paramètre de rappel n'est pas appelé

  12. 12

    Impossible d'insérer des lignes et d'obtenir une contrainte de clé étrangère échoue

  13. 13

    Comment passer des paramètres d'URL lors de la redirection vers une autre URL?

  14. 14

    Python: exécutez plusieurs commandes dans CMD en une seule instance

  15. 15

    Comment faire une requête rapide vers une URL spécifique

  16. 16

    Authentification angulaire Laravel

  17. 17

    aucun opérateur ne correspond à ces opérandes ; les types d'opérandes sont : std::istream >> const char [5]

  18. 18

    Une erreur fatale s'est produite lors de la création des informations d'identification du client TLS. L'état d'erreur interne est 10013

  19. 19

    Apache XmlBeans NullPointerException

  20. 20

    JS : séparez les éléments du tableau et affichez les éléments individuels dans un tableau

  21. 21

    WebScrape - 獲取href

chaudétiquette

Archive