"pointeur +1" pointe l'élément suivant ?

"pointeur +1" pointe l'élément suivant ? - C - Programmation

Marsh Posté le 27-08-2005 à 19:11:33    

c'est extrait d'un code C que j'ai retranscrit en C++, mais sur ce point la je doute
 
Un pointeur auquel au fait p+1    est ce qu'il pointe sur l'element suivant dans la structure (structure PIXEL)
 

Code :
  1. PIXEL* p = this->adr ;
  2.   for (int i=0; i<h ; i++)
  3.   {
  4.     p+=l;
  5.     this->tab[i]= p ;
  6.   }

Reply

Marsh Posté le 27-08-2005 à 19:11:33   

Reply

Marsh Posté le 27-08-2005 à 19:15:32    

euh ... non


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-08-2005 à 19:15:55    

[:gratgrat]
 
Faut demander à Emmanuel, mais je pense pas, +1 ça va incrémenter le pointeur genre d'un octet unique, donc ça dépend de la taille des éléments de la structure...
 
Et je sais plus si tous les éléments d'une structure sont stockés de manière contigue


Message édité par masklinn le 27-08-2005 à 19:16:28

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-08-2005 à 19:16:50    

Non, il ingremente le pointeur de sizeof(PIXEL).
Donc apres p +=1, p pointera sur la prochaine structure PIXEL.


Message édité par chagarou le 27-08-2005 à 19:17:12
Reply

Marsh Posté le 27-08-2005 à 19:18:18    

chagarou a écrit :

Non, il ingremente le pointeur de sizeof(PIXEL).
Donc apres p +=1, p pointera sur la prochaine structure PIXEL.


sûr?
(et il pointera sur ce qu'il y a juste après la structure PIXEL actuelle, c'est pas nécessairement une structure PIXEL :o)


Message édité par masklinn le 27-08-2005 à 19:18:58

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-08-2005 à 19:18:50    

masklinn a écrit :

[:gratgrat]
 
Faut demander à Emmanuel, mais je pense pas, +1 ça va incrémenter le pointeur genre d'un octet unique, donc ça dépend de la taille des éléments de la structure...
 
Et je sais plus si tous les éléments d'une structure sont stockés de manière contigue


 
 
C'est exactement les questions que je me posais....
 
Bon, premier point les elements sont des OCTETS ce qui correspond au +1.
( donc question subsidière : comment faire si ce ne sont pas des octets)
 
Et pour ce qui est de la continuité, c'est vraiment un coup de bol si ca marche... avec une centaine d'elements, OK mais plus ????
 
Comment on fait pour obtenir le "pointeur suivant" ?   fonction spéciale ?

Reply

Marsh Posté le 27-08-2005 à 19:19:06    

pour tout pointeur p de type autre que void*, p + 1 pointe vers l'élément suivant dans un tableau (ou un vector en C++, mais c'est crade).
 
Par exemple :
 
[cpp]int* tab;
tab = new int[42];
 
int* p = &(tab[20]); // p pointe vers le 21e entier
p = p + 1; // p pointe vers le 22e entier
 
Ici tu semble avoir un tableau de PIXEL, donc c'est bon
Attention dans ta boucle tu commence à p + 1, je crois que t'as inversé les deux lignes.

Reply

Marsh Posté le 27-08-2005 à 19:19:23    

masklinn a écrit :


sûr?  
(et il pointera sur ce qu'il y a juste après la structure PIXEL actuelle, c'est pas nécessairement une structure PIXEL :o)


Puisque que la quote a changer, le commentaire aussi :p
Sodomiseur de diptère :o


Message édité par chagarou le 27-08-2005 à 19:22:20
Reply

Marsh Posté le 27-08-2005 à 19:19:25    

chagarou a écrit :

Non, il ingremente le pointeur de sizeof(PIXEL).
Donc apres p +=1, p pointera sur la prochaine structure PIXEL.


j'ai des doute...
je sais que l'opérateur ++ le fait mais le += me laisse perplexe


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-08-2005 à 19:19:53    

chagarou a écrit :

Non, il ingremente le pointeur de sizeof(PIXEL).
Donc apres p +=1, p pointera sur la prochaine structure PIXEL.


 
 
Si ca avait été  TABLEAU_HYPER_GROS
il aurai incrementé de    sizeof(TABLEAU_HYPER_GROS) ???

Reply

Marsh Posté le 27-08-2005 à 19:19:53   

Reply

Marsh Posté le 27-08-2005 à 19:20:10    

oui
 
type* p;
 
p + 1 == "adresse p" + sizeof(type)


Message édité par jesus_christ le 27-08-2005 à 19:21:11
Reply

Marsh Posté le 27-08-2005 à 19:20:44    

Tiens, va voir la page d'Emmanuel, tu trouveras sûrement tout ce qu'il te faut sur les structures et les pointeurs ;)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-08-2005 à 20:08:21    

NounouRs a écrit :

c'est extrait d'un code C que j'ai retranscrit en C++, mais sur ce point la je doute
 
Un pointeur auquel au fait p+1    est ce qu'il pointe sur l'element suivant dans la structure (structure PIXEL)
 

Code :
  1. PIXEL* p = this->adr ;
  2.   for (int i=0; i<h ; i++)
  3.   {
  4.     p+=l;
  5.     this->tab[i]= p ;
  6.   }



Le pointeur étant de type PIXEL, il sera augmenté de sizeof(PIXEL) à chaque tour. Autrement dit, si this->addr est l'adresse d'un tableau de PIXEL, on pointera sur chaque PIXEL en séquence (this->addr[0], this->addr[1] etc.)
 
L'arithmétique des pointeurs, c'est la base du C...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:09:16    

masklinn a écrit :

[:gratgrat]Faut demander à Emmanuel,


Je ne suis heureusement pas le seul à savoir répondre à ça...

Citation :

+1 ça va incrémenter le pointeur genre d'un octet unique,


Ben non... Ca va pointer à sizeof (T) bytes plus loin...
 
C'est le moment de relire son livre de C...


Message édité par Emmanuel Delahaye le 27-08-2005 à 20:11:59

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:10:01    

masklinn a écrit :

sûr?
(et il pointera sur ce qu'il y a juste après la structure PIXEL actuelle, c'est pas nécessairement une structure PIXEL :o)


Ca c'est un autre problème. Le C n'est pas protégé contre ça.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:12:34    

Emmanuel Delahaye a écrit :

Je ne suis heureusement pas le seul à savoir répondre à ça...


Oui mais vu tes connaissances peu ou prou encyclopédique en C, si tu réponds on est à peu près sûr que la réponse sera correcte, et que les corner case seront mentionnés ;)

Reply

Marsh Posté le 27-08-2005 à 20:13:38    

jesus_christ a écrit :

pour tout pointeur p de type autre que void*, p + 1 pointe vers l'élément suivant dans un tableau


Oui.

Citation :

int* tab;
tab = new int[42];




Pas du C. Dommage...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:14:52    

KangOl a écrit :

j'ai des doute...
je sais que l'opérateur ++ le fait mais le += me laisse perplexe


Et c'est quoi la différence entre p++ et p += 1 ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:16:17    

NounouRs a écrit :

Si ca avait été  TABLEAU_HYPER_GROS
il aurai incrementé de    sizeof(TABLEAU_HYPER_GROS) ???


Si tu veux dire TYPE_HYPER_GROS, ben oui.
 
Je ne comprends pas. Cette notion est élémentaire en C...


#include <stdio.h>
 
int main (void)
{
   struct test
   {
      char s[0x10];
   };
 
   struct test x;
   struct test *p = &x;
 
   printf ("sizeof (struct test) = %X bytes (hexa)\n"
           ,(unsigned) sizeof (struct test));
 
   printf ("p = %p\n", (void *) p);
 
   p++;
 
   printf ("p = %p\n", (void *) p);
 
   p += 1;
 
   printf ("p = %p\n", (void *) p);
 
   ++p;
 
   printf ("p = %p\n", (void *) p);
 
   return 0;
}


on voit bien que l'adresse augmente de 10 en 10 (hexa) :  


sizeof (struct test) = 10 bytes (hexa)
p = 0073FDA0
p = 0073FDB0
p = 0073FDC0
p = 0073FDD0



Message édité par Emmanuel Delahaye le 27-08-2005 à 20:36:32

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:26:21    

Emmanuel Delahaye a écrit :

Et c'est quoi la différence entre p++ et p += 1 ?


p++ va créé un nouvel "objet"
p+=1 correspond plus à ++p ...
 
 
 
 
 
 
 
 
bon ok je chipote mais c'était pour avoir quelque chose à répondre  [:kangol]


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-08-2005 à 20:31:47    

KangOl a écrit :

p++ va créé un nouvel "objet"


Quoi ? Quel nouvel objet ? La valeur du pointeur va être augmentée de la taille de l'objet, et il va donc pointer sur l'objet suivant (qu'il existe ou non n'est pas le problème du pointeur, qui peut pointer n'importe où). Il n'y a aucune 'création' d'objet. Je n'ai pas vu d'allocation mémoire.

Citation :

p+=1 correspond plus à ++p ...


p++, p+=1 et ++p sont strictement identiques (tant qu'ils sont utilisés seuls).


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:34:55    

j'ai dit que c'etait pour chipoter :o
 
(et puis c'est vrai qu'en c le terme "objet" ne veux rien dire...)


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-08-2005 à 20:38:10    

KangOl a écrit :

(et puis c'est vrai qu'en c le terme "objet" ne veux rien dire...)


Si. Un objet, c'est un entitée qui a une adresse, une taille et une valeur. Ca s'appelle aussi une variable.


Message édité par Emmanuel Delahaye le 27-08-2005 à 20:43:17

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:39:55    

note pour moi meme : emmanuelle a toujours quelque chose a répondre (et toujours juste)


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-08-2005 à 20:44:06    

KangOl a écrit :

note pour moi meme : emmanuelle a toujours quelque chose a répondre (et toujours juste)


Tant qu'il y a des imprécisions ou des erreurs, oui. Par exemple, c'est Emmanuel et non emmanuelle... Rêve pas !


Message édité par Emmanuel Delahaye le 27-08-2005 à 20:44:40

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-08-2005 à 20:52:29    

http://www.meskweek.net/html/emoticons/meske00441.gif


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 28-08-2005 à 10:11:26    

KangOl a écrit :

j'ai dit que c'etait pour chipoter :o
 
(et puis c'est vrai qu'en c le terme "objet" ne veux rien dire...)


 
Ouais enfin là, tu aurais quand même mieux fait de te taire. On fait pas du Perl, là.
 
(et comme l'a fait remarquer ED, l'arithmétique des pointeurs, c'est la base en C)


Message édité par el muchacho le 28-08-2005 à 10:13:24
Reply

Marsh Posté le 28-08-2005 à 19:17:14    

Citation :

int* tab;
tab = new int[42];




Pas du C. Dommage...
 
c'est vrai mais nounours a dit :

Citation :

c'est extrait d'un code C que j'ai retranscrit en C++, mais sur ce point la je doute


et dans son code il y a un this->adr qui a toutes les chances d'être du C++ même si ça pourrait être du C. Il aurait du poster ça dans la rubrique C++, comme ça Taz lui aurait dit que l'arithmétique de ptr c'est du C :D


Message édité par jesus_christ le 29-08-2005 à 18:47:03
Reply

Marsh Posté le 28-08-2005 à 19:22:08    

masklinn a écrit :


Faut demander à Emmanuel, mais je pense pas, +1 ça va incrémenter le pointeur genre d'un octet unique, donc ça dépend de la taille des éléments de la structure...


 
hé ben ca en raconte des conneries un expert [:klem3i1]

Reply

Marsh Posté le 28-08-2005 à 19:23:37    

chrisbk a écrit :

hé ben ca en raconte des conneries un expert [:klem3i1]


Sauf que, contrairement à toi, chuis pas expert en C :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-08-2005 à 19:25:49    

masklinn a écrit :

Sauf que, contrairement à toi, chuis pas expert en C :o


 
c'est les bases ca, mon petit [:klem3i1]
 

Reply

Marsh Posté le 28-08-2005 à 19:30:09    

chrisbk a écrit :

c'est les bases ca, mon petit [:klem3i1]


Emmanuel l'a déjà dit, s'mal de répéter :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-08-2005 à 19:30:51    

masklinn a écrit :

Emmanuel l'a déjà dit, s'mal de répéter :o


 
on ne le dira jamais assez, vil petit mangecaca  [:klem3i1]

Reply

Marsh Posté le 28-08-2005 à 19:32:50    

chrisbk a écrit :

on ne le dira jamais assez, vil petit mangecaca  [:klem3i1]


Je ne mange jamais de kaka, c'est sale [:mmmfff]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-08-2005 à 19:35:14    

masklinn a écrit :

Je ne mange jamais de kaka, c'est sale [:mmmfff]


Faut le laver avant avec du PQ ayant peu servi...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-08-2005 à 19:43:28    

enfin emmanuel, ca va pas de faire de la pollution ainsi ? [:pingouino]

Reply

Marsh Posté le 28-08-2005 à 19:44:30    

Emmanuel Delahaye a écrit :

Faut le laver avant avec du PQ ayant peu servi...


ok http://membres.lycos.fr/angel2k/petrus/japtounet.gif

chrisbk a écrit :

enfin emmanuel, ca va pas de faire de la pollution ainsi ? [:pingouino]


Ben non, tu manges le papier avec, tu laves ton caca, tu enveloppes le papier autour, et comme ça tu te met pas de caca sur les doigts [:iorili]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-08-2005 à 19:45:11    

[:jean-guitou]

Reply

Marsh Posté le 28-08-2005 à 21:03:02    

NounouRs a écrit :

c'est extrait d'un code C que j'ai retranscrit en C++, mais sur ce point la je doute
 
Un pointeur auquel au fait p+1    est ce qu'il pointe sur l'element suivant dans la structure (structure PIXEL)
 

Code :
  1. PIXEL* p = this->adr ;
  2.   for (int i=0; i<h ; i++)
  3.   {
  4.     p+=l;
  5.     this->tab[i]= p ;
  6.   }



 
 

Code :
  1. memcpy(this->tab, this->adr, h * sizeof *this->adr);


 
en espérant de que ce sont de PIXEL des 2 côtés.

Reply

Marsh Posté le 28-08-2005 à 21:04:20    

taz > perdu [:dawa]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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