question sur les pointeurs

question sur les pointeurs - C - Programmation

Marsh Posté le 27-05-2007 à 22:11:17    

bonjour,

 

j'aimerai savoir si

 
Code :
  1. int a = 1;


est la même chose que

Code :
  1. int * const b = &a;
 

sinon j'ai une petite autre question sur les pointeurs :whistle:

 

est ce que

 
Code :
  1. int **a = (int **)malloc(sizeof(int*)*10 );
 

est pareil que :

 
Code :
  1. int *b[10];
 

en fait, j'aimerai savoir si **a et *b[] écrivent au meme endroit, car dans l'un c'est la notation pointeur et dans l'autre la notation tableau. Or, je crois que les taleaux et les pointeurs n'ecrivent pas au meme endroit (heap/Stack) ??

 

merci par avance  :jap:

 


Message édité par in_your_phion le 27-05-2007 à 22:13:22
Reply

Marsh Posté le 27-05-2007 à 22:11:17   

Reply

Marsh Posté le 28-05-2007 à 11:53:44    

Une adresse est une adresse. Derriere tous les type se cache uniqument une adresse, n'oublie pas ca.
tu peux donc faire si ca te chante int *b = &a; et donc *b et a auront toujours la meme valeur que tu auras affecté puisque b pointe sur la meme adresse ou a été alloué statiquement a.
 
En effet déclarer un tableau est une allocation statique -> créé à l'exécution du programme dans son segement data.
Malloc lui alloue dans le tas du programme.

Reply

Marsh Posté le 28-05-2007 à 12:41:33    

int * const b = &a; ça définit un pointeur qui pointera toujours vers a. Par contre je ne dirais pas que c'est la "même chose", dans la mesure ou a est un int et que b reste un pointeur... La syntaxe sera évidemment différente pour accéder au "1".
 
Pour l'autre question : non c'est pas pareil. sizeof a et sizeof b par exemple ne donneront pas la même chose. Aussi b pourrait être défini au niveau global, alors que a ne peut l'être que dans une fonction. D'ailleurs suivant l'endroit ou b est déclaré (global ou dans une fonction mais pas static), la mémoire ne sera pas alloué au même endroit.

Reply

Marsh Posté le 28-05-2007 à 16:27:27    

matafan a écrit :

int * const b = &a; ça définit un pointeur qui pointera toujours vers a. Par contre je ne dirais pas que c'est la "même chose", dans la mesure ou a est un int et que b reste un pointeur... La syntaxe sera évidemment différente pour accéder au "1".
 
Pour l'autre question : non c'est pas pareil. sizeof a et sizeof b par exemple ne donneront pas la même chose. Aussi b pourrait être défini au niveau global, alors que a ne peut l'être que dans une fonction. D'ailleurs suivant l'endroit ou b est déclaré (global ou dans une fonction mais pas static), la mémoire ne sera pas alloué au même endroit.


 
 
salut  :hello:  
 
 
merci pour vos réponses. Je ne suis pas sur de comprendre pas la réponse du deux....est ce que dans ce cas :
 

Code :
  1. int main (int argc, char **argv)


 
n'est pas pareil que  
 

Code :
  1. int main (int argc, char *argv[])


 
?
 
Sauriez vous ou je peux trouver de la doc sur le tas et la pile ?  :sweat:  
 
 
merci encore  

Reply

Marsh Posté le 29-05-2007 à 10:11:16    

Par contre, j'ai un doute sur une chose.
soit ce code :

Code :
  1. char *av[10];
  2. int myfunc(int a, char *zz[10]) {
  3. ...


 
av et zz ne sont pas réservé au même endroit.
zz se trouve dans la pile, et av dans le segment data (ou ailleurs selon des cas que je ne connais pas) du programme.
 
Par contre, si on en précise pas la taille du tableau (*arg[]) pas sur que ca ne soit pas pareil que (**argv)
 
En gros, ca nous fait 3 pour 3 types d'allocation (statique, dans la pile, dans le tas)
Pour la doc, tu devrais chercher de la doc sur ELF, pt etre que ca t'aidera.
 
EDIt : j'avais inversé mes 2 lignes de code, ce qui change tous à mon explication !


Message édité par nORKy le 29-05-2007 à 10:23:48
Reply

Marsh Posté le 29-05-2007 à 11:00:03    

zz ne se trouve nul part... C'est juste un argument de ta fonction. Quand on appelle ta fonction, ce qui est passé en deuxième argument c'est juste une adresse (l'adresse du premier élément du tableau), pas tout le tableau. La valeur de cette adresse dépend de comment est définit le tableau au niveau de l'appelant, pas de la façon dont est déclarée ta fonction myfunc. Le fait que tu donnes la taille du tableau dans ton prototype ne change rien au fait que le tableau est passé par référence.

Reply

Marsh Posté le 30-05-2007 à 15:52:01    

matafan a écrit :

zz ne se trouve nul part... C'est juste un argument de ta fonction. Quand on appelle ta fonction, ce qui est passé en deuxième argument c'est juste une adresse (l'adresse du premier élément du tableau), pas tout le tableau. La valeur de cette adresse dépend de comment est définit le tableau au niveau de l'appelant, pas de la façon dont est déclarée ta fonction myfunc. Le fait que tu donnes la taille du tableau dans ton prototype ne change rien au fait que le tableau est passé par référence.


 
Tous se trouve qq part  :pt1cable:  
Biensur que zz est une référence un pointeur, mais la zone mémoire ou est ce pointeur est dans la pile.
Tous les paramètre de la fonction sont empiler dans la pile (en partant du dernier je crois).
Mais le int a aura bien ses 4 octets (taille du int) dans la pile et cette zone sera remplis avec la valeur passée en paramètre.
Normal, puisque lorsqu'on sors de la fonctionne, tous les paramètres sont dépiler et donc on perd la zone mémoire des paramètres.


Message édité par nORKy le 30-05-2007 à 15:52:33
Reply

Marsh Posté le 31-05-2007 à 08:25:46    

Je croyais que tu parlais de ce qui est pointé par zz, pas de zz lui même. Du coup la question n'a pas grand intéret...
 
D'ailleurs quand tu dis qu'il est dans la pile, ce n'est pas forcément vrai. Sur certaines architecture (Power par exemple), les arguments sont passés dans des registres. Si tu ne compiles pas avec -g et si la fonction n'a pas besoin de manipuler l'adresse de cet argument, il n'est pas écrit dans la pile du tout.

Reply

Sujets relatifs:

Leave a Replay

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