pointeur et chaines de charactères

pointeur et chaines de charactères - C - Programmation

Marsh Posté le 08-05-2008 à 00:17:55    

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 ..

Reply

Marsh Posté le 08-05-2008 à 00:17:55   

Reply

Marsh Posté le 08-05-2008 à 01:24:06    

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.

Reply

Marsh Posté le 08-05-2008 à 01:40:00    

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 ?

Reply

Marsh Posté le 08-05-2008 à 03:12:32    

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é!  --
Reply

Marsh Posté le 08-05-2008 à 12:15:50    

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.

Reply

Marsh Posté le 08-05-2008 à 18:14:15    

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


 
 :??:

Reply

Marsh Posté le 08-05-2008 à 21:06:23    

<< 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

Reply

Marsh Posté le 08-05-2008 à 21:19:49    

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
Reply

Marsh Posté le 08-05-2008 à 21:51:48    

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++.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed