Discussion:Langage C++/Pointeur, Tableaux et références

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche

Arithmétique des pointeurs[modifier le wikicode]

J’aimerais corriger l'exemple et modifier ses commentaires :

int a; // création de la variable int a en pile
int* p = &a; // création de la variable p pointeur sur int et affectation de l'adresse de a.
int* x = p++; // création de la variable x pointeur sur int, affectation de la valeur de p (x vaut &a), puis incrémentation de p
int* y = p; // création de la variable y pointeur sur int et affectation de la nouvelle valeur de p
int* z = ++p; // création de la variable z pointeur sur int, incrémentation de p et affectation de la nouvelle valeur de p
x = p--;
y = p;
z = --p;

// en décomposant
x = p; // (x vaut &a)
p = p + 1; // p étant un pointeur sur int, l'adresse qu’il contient sera incrémentée de 1 x sizeof(int), {{Unité|4|octets}} si l’on est en 32 bit par exemple
y = p; // (y vaut &a + {{Unité|4|octets}})
p = p + 1;
z = p; // (z vaut &a + {{Unité|8|octets}})
x = p; // (x vaut &a + {{Unité|8|octets}})
p = p - 1;
y = p; // (y vaut &a + {{Unité|4|octets}})
p = p - 1;
z = p; // (z vaut &a)

La deuxième partie était erronée (pas d'incrémentation de p). Il faudrait aussi rappeler qu’il est interdit de faire ce genre de magouille, car les adresses sortant de &a sont en terrain inconnu, on a strictement rien à y faire tant que l’on ne les a pas allouées. Ce serait le cas avec l'allocation d'un espace mémoire suffisant - comme l'exemple du tableau - à la place de a. Du coup ce code ne permet pas de créer un tableau, à la limite d'y accéder en utilisant l'adresse d'un tableau à la place de celle de la variable a. Mais je suis un peu fatigué là, alors si vous avez des commentaires, n'hésitez pas...--Nestor Fish 22 août 2008 à 21:01 (UTC)

C'est un exemple permettant d'expliquer l'arithmétique des pointeurs. Il n’est pas censé créer un tableau, juste manipuler un pointeur. Pour ce qui est des magouilles, c’est ce que j’ai essayé de dire dans le texte qui suit avec la validité des adresses. Apparemment pas assez efficacement. :) Ppignol 24 février 2011 à 02:13 (UTC)

Parler des pointeurs si tôt ?[modifier le wikicode]

Bonjour. Parler des pointeurs sans avoir approfondi les variables locales des fonctions me semble dommage. Exemple de code minimal, utile aux débutants : modifier une valeur globalisée par un pointeur dans une fonction. Merci. Domsau2 (discussion) 7 juin 2018 à 00:33 (UTC)

Je suis plutôt d'accord mais c'était un choix de Ppignol (d · c · b · s) donc je le ping ici. JackPotte ($) 7 juin 2018 à 07:39 (UTC)

déclaration de tableau sans spécification de dimensions[modifier le wikicode]

Bonjour, Je suis surpris par votre syntaxe de déclaration sans spécification des dimensions. Avec CodeBlocks, j'ai tenté de compiler l'exemple :

int t3 [][][] = {
                        { 
                             {1, deux}, 
                             {3, 4}, 
                             {5, 6} 
                        }, 
                        {
                             {7, 8}, 
                             {9, 10}, 
                             {11, 12} 
                        }, 
                        { 
                             {13, 14}, 
                             {15, 16}, 
                             {17, 18} 
                        }, 
                        { 
                             {19, 20},
                             {21, 22},
                             {23, 24} 
                        } 
                   };

et j'ai obtenu le message :

||=== Build: Debug in testArrayCpp (compiler: GNU GCC Compiler) ===|
error: declaration of 't3' as multidimensional array must have bounds for all dimensions except the first|

Le message qui précède, non signé?, a été déposé par 2a01:e0a:441:fcb0:491:1374:81ca:38fa (d · c · b · s).

Oui merci, j’ai eu la même erreur avec http://cpp.sh/ puis j'ai corrigé la page. JackPotte ($) 23 février 2020 à 15:40 (UTC)