Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2457 connectés 

  FORUM HardWare.fr
  Programmation
  C

  pointeur et chaines de charactères

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pointeur et chaines de charactères

n°1729803
in_your_ph​ion
Posté le 08-05-2008 à 00:17:55  profilanswer
 

bonjour,
j'aimerai savoir pourquoi je ne peux pas faire :
 

Code :
  1. char * pp[] = {"titi","toto","tat","aaaaaaaaa"};
  2. pp++;


 
alors que je peux faire :
 

Code :
  1. char * t = *(pp + 1);


 
merci ..

mood
Publicité
Posté le 08-05-2008 à 00:17:55  profilanswer
 

n°1729810
tpierron
Posté le 08-05-2008 à 01:24:06  profilanswer
 

Parce qu'un tableau est un pointeur "constant". Tu ne peux pas modifier sa valeur. Pour la même raison, &pp n'a aucun sens. Son adresse est "pp".
 
En simplifiant à mort, voit pp comme un nombre (une adresse) qui sera fixée à la compilation. Du coup tu vois tout de suite que 1234++ ou &1234 n'a aucun sens.

n°1729813
in_your_ph​ion
Posté le 08-05-2008 à 01:40:00  profilanswer
 

tpierron a écrit :

Parce qu'un tableau est un pointeur "constant". Tu ne peux pas modifier sa valeur. Pour la même raison, &pp n'a aucun sens. Son adresse est "pp".
 
En simplifiant à mort, voit pp comme un nombre (une adresse) qui sera fixée à la compilation. Du coup tu vois tout de suite que 1234++ ou &1234 n'a aucun sens.


 
salut,
merci, alors ca équivaut à :

Code :
  1. char * const pp[] ;


 
?
 
mais pourquoi c'est un pointeur constant ?

n°1729819
gilou
Modérateur
Modzilla
Posté le 08-05-2008 à 03:12:32  profilanswer
 

in_your_phion a écrit :

bonjour,
j'aimerai savoir pourquoi je ne peux pas faire :
 

Code :
  1. char * pp[] = {"titi","toto","tat","aaaaaaaaa"};
  2. pp++;


 
alors que je peux faire :
 

Code :
  1. char * t = *(pp + 1);


 
merci ..

pp++, c'est une expression qui voudrait changer la valeur de pp. Or pp est un tableau, et est donc un element fixe (ben oui, quoi, le tableau, une fois alloué, il change pas de place). Par contre, pp + 1, ca ne modifie pas la valeur de pp; ca represente l'adresse du 2e element du tableau (l'adresse du premier étant pp), d'apres la signification de l'addition d'un entier a un tableau.
Ton tableau contient des pointeurs sur des chaines de caracteres. Donc, *(pp+1) est un pointeur sur la deuxieme chaine, ce qui permet d'écrire: char * t = *(pp + 1); comme assignation de la valeur d'un pointeur dans un autre.
A+,


Message édité par gilou le 08-05-2008 à 03:57:56

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1729900
Tarabiscot​e
Posté le 08-05-2008 à 12:15:50  profilanswer
 

tpierron a écrit :

Parce qu'un tableau est un pointeur "constant". Tu ne peux pas modifier sa valeur. Pour la même raison, &pp n'a aucun sens. Son adresse est "pp".


 
Désolé de te corriger mais &pp est parfaitement valide c'est tout simplement l'adresse de ce tableau.
Ce qui faut savoir c'est que pp est égale à &pp afin de garder la "notation" pointeur.
Donc quand on écrit pp++, on fait en fait (&pp)++ or l'adresse d'une variable est constante.

n°1729990
in_your_ph​ion
Posté le 08-05-2008 à 18:14:15  profilanswer
 

salut,
 
merci pour vos réponses :) je comprends maintenant.
 
par contre il y toujours un truc qui n'est pas clair, c'est la différence entre tab et &tab.  
 
par exemple :
 

Code :
  1. int p1[][3] = { 11,22,33,  44,55,66 };
  2. int (*t1)[3] = p1;  //un pointeur vers un tableau de trois entiers
  3. printf("%p %p\n", t1 , *t1 );       //affichent la meme addresse
  4. printf("%d %d\n", *t1[0], t1[0]  );    //affichent pas la même chose ..?


 


0xbfc5e3e0 0xbfc5e3e0
11 -1077550112


 
 :??:

n°1730052
jesus_chri​st
votre nouveau dieu
Posté le 08-05-2008 à 21:06:23  profilanswer
 

<< c'est la différence entre tab et &tab.  >>
 
si tab est un tableau (donc de type machin[]) tab et &tab sont synonyme : l'adresse d'un tableau et le tableau lui-même. Pareil pour les fonctions.
 
int tab[3];
-> tab == &tab
 
int f(char);
int (*pf1)(char) = f;
int (*pf2)(char) = &f;
-> pf1 == pf2

n°1730057
dap++
Script kiddie
Posté le 08-05-2008 à 21:19:49  profilanswer
 

jesus_christ a écrit :

si tab est un tableau (donc de type machin[]) tab et &tab sont synonyme : l'adresse d'un tableau et le tableau lui-même.


Attention il y a une différence de types. Exemples :

Code :
  1. #include <stdio.h>
  2. int main (void)
  3. {
  4.    int tab[10];
  5.  
  6.    printf ("%lu %lu\n", (unsigned long)sizeof tab,
  7.            (unsigned long)sizeof &tab);
  8.          
  9.    printf ("%p %p\n", (void*)(tab+1), (void*)(&tab+1));
  10.    return 0;
  11. }
 

in_your_phion> Les chaînes littérales fournissent des adresses qui ne peuvent être accédées qu'en lecture, du coup il vaut mieux utiliser const :

Code :
  1. char const *p = "pouet";
 

D'ailleurs ton compilateur devrait te prévenir si il est bien réglé.


Message édité par dap++ le 08-05-2008 à 21:21:32

---------------
dap.developpez.com
n°1730064
jesus_chri​st
votre nouveau dieu
Posté le 08-05-2008 à 21:51:48  profilanswer
 

exact pour les types de tableau. Par contre il n'y a pas de problème pour les fonctions.
 
pour le const, il est toujours optionnel en C, d'ailleurs la plupart des prog en C n'utilisent jamais const. Donc le compilateur est sensé avertir s'il compile en mode C++.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  pointeur et chaines de charactères

 

Sujets relatifs
Comment trier des chaines de caractère dans un tableau ?les chaines de caracteres en assembleur
[C++] set et ref/pointeur vers objetProblème de pointeur objet mère qui pointe sur objet fille
Affecter un pointeur de fichier a un autre[ASM+C] Chaines de caractere
javascript: problème avec des chaines qui contiennent du php[C++ .NET] Comment passer un pointeur d'objet managé à un thread?
traitement de chaines de caractères (débutant)Concaténation de chaînes, problème avec langues sens d'écriture ≠
Plus de sujets relatifs à : pointeur et chaines de charactères


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR