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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

différence entre un char p[][] et un char * p[] ?

n°693882
jagstang
Pa Capona ಠ_ಠ
Posté le 06-04-2004 à 16:40:52  profilanswer
 

Reprise du message précédent :

push a écrit :


en mémoire  :lol:  


>> oui mais encore, précise
 

push a écrit :


enfin c bien confus quoi ces pointeurs enfait  :sarcastic:  


Faute avouée à moitié pardonée :)

mood
Publicité
Posté le 06-04-2004 à 16:40:52  profilanswer
 

n°693885
Taz
bisounours-codeur
Posté le 06-04-2004 à 16:41:53  profilanswer
 

déjà qu'un tableau et un pointeur sont 2 choses fondamentalements différentes ...

n°693888
drasche
Posté le 06-04-2004 à 16:44:17  profilanswer
 

push a écrit :

enfin c bien confus quoi ces pointeurs enfait  :sarcastic:  


regarde les caractéristiques de l'un et l'autre (la manière d'allouer de l'espace pour tes données par exemple, puis va lire la doc au sujet de ce que tu auras trouvé), tu vas entrevoir des différences non?


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°693898
push
/dev/random
Posté le 06-04-2004 à 16:54:46  profilanswer
 

j'ai pas encore tout lus mais,
 
un pointeur ca contient une adresse.
 
quand on déclare un tableau on créer un pointeur qui pointera vers la premier élément de ce tableau.
 
et quand je fais un malloc et que j'alloue de la mémoire à un pointeur j'ai tjrs penssé que ca revenait à faire un tableau, le pointeur pointera vers l'adresse de cette zone mémoire créer avec malloc.
 
je vais continuer à lire j'ai surement dis des bétises.

n°693907
Taz
bisounours-codeur
Posté le 06-04-2004 à 17:08:07  profilanswer
 

push a écrit :


quand on déclare un tableau on créer un pointeur qui pointera vers la premier élément de ce tableau.

manqué

n°693963
push
/dev/random
Posté le 06-04-2004 à 18:02:04  profilanswer
 

qu'est-ce que tu appelles une l-value Taz ?

n°693967
Taz
bisounours-codeur
Posté le 06-04-2004 à 18:03:23  profilanswer
 

une valeur-gauche

n°693980
jagstang
Pa Capona ಠ_ಠ
Posté le 06-04-2004 à 18:13:15  profilanswer
 

une valeur qu'on ne peut affecter.  
 

n°694002
push
/dev/random
Posté le 06-04-2004 à 18:32:45  profilanswer
 


 
je vais faire un 2ème lancé alors,
 
quand on déclare un tableau char t[5]; ya un espace de la taille de 5 caractères qui est alloué et t est transformer en un pointeur qui contient &t[0];
 
maintenant dans le cas du tableau de pointeur, char * p[5]; allocation de mémoire de la taille de 5 pointeurs et p devient un pointeur de pointeur ! qui contient l'adresse de &p[0]
 
maintenant avec malloc que se passe t'il exactement quand j'alloue de la mémoire ca je sais pas encore.


Message édité par push le 06-04-2004 à 18:33:16
n°694003
Taz
bisounours-codeur
Posté le 06-04-2004 à 18:33:11  profilanswer
 

JagStang a écrit :

une valeur qu'on ne peut affecter.  
 
 

à gauche d'un = donc

mood
Publicité
Posté le 06-04-2004 à 18:33:11  profilanswer
 

n°694006
Taz
bisounours-codeur
Posté le 06-04-2004 à 18:36:47  profilanswer
 

push a écrit :


quand on déclare un tableau char t[5]; ya un espace de la taille de 5 caractères qui est alloué et t est transformer en un pointeur qui contient &t[0];

y a aucune transformation du tout. t est un tableau et comme dit chaque T[N] est un type distinct. t est castable implicitement en T* de manière que t -> &t[0]

push a écrit :


maintenant dans le cas du tableau de pointeur, char * p[5]; allocation de mémoire de la taille de 5 pointeurs et p devient un pointeur de pointeur ! qui contient l'adresse de &p[0]

p est un tableau pas un pointeur

push a écrit :


maintenant avec malloc que se passe t'il exactement quand j'alloue de la mémoire ca je sais pas encore.

malloc te renvoie un pointeur sur le premier byte d'une zone mémoire contigüe non-initialisée de taille n

n°694007
push
/dev/random
Posté le 06-04-2004 à 18:38:23  profilanswer
 

quand vous parlez de contigû en mémoire c que les adresses mémoires de chaques éléments se suivent ?

n°694009
Taz
bisounours-codeur
Posté le 06-04-2004 à 18:39:13  profilanswer
 

non, on veut dire <la définition du dictionnaire>

n°694063
push
/dev/random
Posté le 06-04-2004 à 19:25:30  profilanswer
 

maintenant que j'ai saisi la différence entre tableau - pointeur,
 
j'en reviens à mon histoire de strcmp, mais ca m'explique pas le pourquoi du comment.
 
quand j'utilise dans mon strcmp,  *(char **)a  pour le tri d'un char *p[], c'est que qsort lui transmet donc un pointeur de pointeur de char alors que je n'ai qu'un tableau de pointeur de char.
 
j'y arriverai un jour  :heink:


Message édité par push le 06-04-2004 à 19:26:28
n°694069
jagstang
Pa Capona ಠ_ಠ
Posté le 06-04-2004 à 19:30:44  profilanswer
 

le plus important, que se passe-t-il quand tu fais  
 
int m[1000][1000] ;
 
ou
 
int *m[1000] = malloc(1000*sizeof(int)) ;
 
c'est TRES différent au niveau de la mémoire...


Message édité par jagstang le 06-04-2004 à 19:31:17
n°694125
push
/dev/random
Posté le 06-04-2004 à 20:15:29  profilanswer
 

int m[1000][1000];  
 
c'est un tableau m de 1000 éléments qui sont des tableaux de 1000 éléments qui sont des char.
 
niveau mémoire je ne sais pas trop mais je viens de faire un essais, si je fais un printf("%x",m[1]); par ex j'ai bien une adresse mémoire.
 
 
pour int *m[1000] = malloc(1000*sizeof(int)) ;
 
je comprend pas très bien l'écriture je ne savais pas qu'on pouvait alloué de la mémoire à un tableau de *, j'aurais fait une boucle pour allouer de la mémoire à chaque pointeur.

n°694132
Taz
bisounours-codeur
Posté le 06-04-2004 à 20:28:10  profilanswer
 

tu comprends surtout pas en fait comment on se sert de malloc
tu aurais ? ben fait donc, on a jamais dit le contraire

n°694137
push
/dev/random
Posté le 06-04-2004 à 20:44:08  profilanswer
 

Taz a écrit :

tu comprends surtout pas en fait comment on se sert de malloc
tu aurais ? ben fait donc, on a jamais dit le contraire


 
bein si comme tu me l'a dis toi même malloc(n) alloue un espace mémoire de taille n et renvois un pointeur qui pointe vers le début de cette zone.

n°694145
Taz
bisounours-codeur
Posté le 06-04-2004 à 20:56:25  profilanswer
 

je t'ai aussi donné la définition d'un tableau. alors fais pas l'idiot

n°694159
push
/dev/random
Posté le 06-04-2004 à 21:35:07  profilanswer
 

Taz a écrit :

je t'ai aussi donné la définition d'un tableau. alors fais pas l'idiot


 
je fais pas l'idiot  :pt1cable:  
 
je comprend tjrs pas le coup du *(char **)a dans mon strcmp c tout.

n°694222
Taz
bisounours-codeur
Posté le 06-04-2004 à 22:44:02  profilanswer
 

parce que a est en fait un char**

n°694307
push
/dev/random
Posté le 07-04-2004 à 00:21:18  profilanswer
 

je sais mais pq c'est un char** dans le cas du p * [] et un char* dans le cas du p[][] c'est ca que je ne comprend pas.

n°694308
Taz
bisounours-codeur
Posté le 07-04-2004 à 00:23:23  profilanswer
 

ben parceque qsort appelle compare(&element[i], &element[j])

n°694321
push
/dev/random
Posté le 07-04-2004 à 00:57:22  profilanswer
 

je crois qu'on est près du but la  :lol:  
 
un peu plus haut je disais avoir fait un printf("%x",n[1]); (n[10][10] et avoir vu une adresse mémoire.
 
je suppose que cette adresse pointe sur le premier caractère du deuxième "sous tableau" donc que c un pointeur de caractère.
 
donc si qsort transmet &n[1] par exemple il envois donc l'adresse du pointeur de caractère qui pointe le premier caractère de la chaine à comparer.
 
maintenant avec le p * [], si il transmet &p[1],il transmet l'adresse d'un pointeur de car. qui pointe vers le premier caractère d'une chaine à comparer.
 
et ya de nouveau pas de différence entre les 2 dans mon résonnement donc...  :cry:  

n°694742
push
/dev/random
Posté le 07-04-2004 à 15:52:57  profilanswer
 

:??:

n°695031
push
/dev/random
Posté le 07-04-2004 à 18:57:25  profilanswer
 

up  :bounce:  je voudrais vraiment comprendre.

n°695261
push
/dev/random
Posté le 07-04-2004 à 22:37:24  profilanswer
 

:bounce:

n°695267
Taz
bisounours-codeur
Posté le 07-04-2004 à 22:45:47  profilanswer
 

quoi ? on a compris que tu comprenais pas, on y peut rien

n°695291
push
/dev/random
Posté le 07-04-2004 à 23:07:26  profilanswer
 

dis moi se qui ne va pas dans mon résonnement au-dessus alors.

n°695988
push
/dev/random
Posté le 08-04-2004 à 20:08:45  profilanswer
 

up pour que quelqun ai la gentillesse de me dire se qui ne va pas dans mon dernier résonnement,
 
merci...

n°695997
bjone
Insert booze to continue
Posté le 08-04-2004 à 20:23:07  profilanswer
 

push a écrit :

up pour que quelqun ai la gentillesse de me dire se qui ne va pas dans mon dernier résonnement,
 
merci...


 
moi je vais te poser une question par rapport à tes printfs:
 
qu'est-ce qui n'a pas d'adresse ?


Message édité par bjone le 08-04-2004 à 20:25:32
n°696015
push
/dev/random
Posté le 08-04-2004 à 20:38:53  profilanswer
 

je suis pas sur de comprendre ta question  :heink:  
 
toute donnée à une adresse, se que je comprend pas c'est que dans le cas d'un tris de p[][] qsort transmet 2 pointeurs de char et dans le cas d'un tris de p * [] il transmet 2 pointeur de pointeur de char.
 
je dois rater un épisode quelque part mais où  :sarcastic:

n°696027
bjone
Insert booze to continue
Posté le 08-04-2004 à 20:49:03  profilanswer
 

qsort appelle la fonction de comparaison avec deux pointeurs sur les éléments à comparer, c'est à toi d'interpréter les pointeurs dans ta fonction de comparaison...
 

n°696029
bjone
Insert booze to continue
Posté le 08-04-2004 à 20:59:43  profilanswer
 

ton char p[][], ramené au niveau p[] c'est quoi comme l'élément manipulé par qsort ?
 
et avec char *p[], c'est quoi l'élement manipulé ?

n°696030
push
/dev/random
Posté le 08-04-2004 à 21:00:13  profilanswer
 

bein oui, je met cette exemple la comme fonction de comparaison
 

Code :
  1. static int pstrcmp(const void* left, const void* right)
  2.   {
  3.       return strcmp(*(const char**)left, *(const char**)right);
  4.   }


 
c'est dans le cas d'un tris d'un tableau de pointeur.
 
et dans le cas d'un tris d'un tableau t[][] mon strcmp devient
 

Code :
  1. (const char*)left, (const char*)right);


 
je comprend pas pq dans un cas c un *char que qsort envois à comparer et dans l'autre un **char.

n°696033
push
/dev/random
Posté le 08-04-2004 à 21:04:01  profilanswer
 

bein p[][] ramené à p[] pour moi c un pointeur de char vu qu'un printf("%x",p[0]) me renvois une adresse qui pointe sur un char.
 
et dans le cas de p * [] , p[] c la même chose un pointeur de char c'est ca que je comprend pas.

n°696034
push
/dev/random
Posté le 08-04-2004 à 21:06:12  profilanswer
 

pour p[][] rammené à p[] je suppose que ce n'est pas un *char et c'est la que je me trompe mais je vois pas bien pq ?

n°696073
bjone
Insert booze to continue
Posté le 08-04-2004 à 22:18:41  profilanswer
 

printf("%x",p[0]) te renverra toujours qqchose puisque comme tu l'as dit toute donnée a une adresse (hormis les registre du cpu pour répondre à ma question). donc printf soit il te prends l'adresse, soit il te sort un truc issu d'un cast. (dans le cas de ton exemple, printf ne prouves pas grand chose).
 

n°696074
bjone
Insert booze to continue
Posté le 08-04-2004 à 22:19:11  profilanswer
 

y'a personne pour aider ? :lol:


Message édité par bjone le 08-04-2004 à 22:19:24
n°696076
bjone
Insert booze to continue
Posté le 08-04-2004 à 22:25:25  profilanswer
 

push a écrit :

bein p[][] ramené à p[] pour moi c un pointeur de char vu qu'un printf("%x",p[0]) me renvois une adresse qui pointe sur un char.
 
et dans le cas de p * [] , p[] c la même chose un pointeur de char c'est ca que je comprend pas.


 
bon, pour trier un p[100][16], tu fais comment avec qsort au niveau de l'appel ?
et pareil avec un char *p[100].
 
entre un p[100][16] et un char *p[100], c'est quoi qui sera interverti par qsort en fonction du résultat de la comparaison ? (pour simplifier et sans entrer dans les détails de l'implémentation d'un quicksort)


Message édité par bjone le 08-04-2004 à 22:29:39
n°696116
push
/dev/random
Posté le 08-04-2004 à 23:22:14  profilanswer
 

bon.. lol
 
 
pour le printf("%x" ); si je fais ca sur un int je n'optient pas une adresse, j'obtient ca uniquement sur un pointeur, logique vu qu'un pointeur contient une adresse lol. c'est pour ca que je trouve pas ca très logique que x de p[x][] contienne une adresse et je parle pas de la sienne hein..  
 
pour qsort dans le cas d'un p * [] bein il intervertit les pointeur , et ca ca me pose pas de problème au niveau de la fonction de comparaison.
 
c'est pour le tableau p[][] que ca pose problème, il intervertit quoi ? bonne question lol si jme base sur mon résonnement d'au dessus il intervertit aussi des pointeurs de char c'est ca qui est fous  :pt1cable:  
 
 :hello:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
Différence entre chaques languages de programmation ?Pb : "cannot convert char[2] to char, il m'écrit le code ASCII...
de char** à void**conversion string -> char *
probleme pointeur void alors qu'un cast de char* marche :\fonction char -> bool
[PHP Mysql] probleme pour avoir la difference entre 2 dates.[OpenGL] difference (newbie)
[DEBUTANT]Problème avec const char[C] Question sur strtol (conversion de char* en int)
Plus de sujets relatifs à : différence entre un char p[][] et un char * p[] ?


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