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

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

Marsh Posté le 06-04-2004 à 13:32:55    

voila dans mon esprit un tableau à 2 dimentions cela équivalait à faire un tableau de pointeur où j'aurais alloué de la mémoire à chaque pointeur mais apparement non ?
 
donc je penssais qu'un char p[2][3];  
 
et un char * p[2]; p[0]=malloc(3); p[1]=malloc(3);
 
était identique.
 
 :jap:


Message édité par push le 07-04-2004 à 14:10:18
Reply

Marsh Posté le 06-04-2004 à 13:32:55   

Reply

Marsh Posté le 06-04-2004 à 13:40:12    

non
 
[2][3] tu as tout contigu en mémoire {{ , , }, { , , }}
 
avec un tableau de pointeur, seuls tes pointeurs se contigus, ce qui est pointé se trouve n'importe ou

Reply

Marsh Posté le 06-04-2004 à 13:44:18    

mais dans la manipulation de l'un commme de l'autre je peux utiliser la forme p[][], alors j'ai du mal à saisir dans le code de tantot avec qsort pourquoi j'ai du modifier quelque chose dans mon strcmp  :heink:

Reply

Marsh Posté le 06-04-2004 à 13:46:41    

bon allez, qui me colle la définition d'un tableau

Reply

Marsh Posté le 06-04-2004 à 13:48:04    

parce que l'un est contigu, l'autre nécessite un dereferencement

Reply

Marsh Posté le 06-04-2004 à 13:50:05    

sans vouloir abuser taz, tu pourrais me dire plus clairement se que tu veux dire par contigu et dereferencement  :whistle:

Reply

Marsh Posté le 06-04-2004 à 13:52:27    

ben contigü et dereferencer, ben *pointeur

Reply

Marsh Posté le 06-04-2004 à 14:12:11    

Code :
  1. void qsort(void *base, size_t nmemb, size_t size,
  2.                   int(*compar)(const void *, const void *));


 

Code :
  1. int strcmp(const char *s1, const char *s2);


 
qsort à besoin de 4 arguments, 1 void *, le nombre d'éléments, la taille d'un de ces éléments et une fonction de comparaison qui prendra 2 void* en arguments.
 
et strcmp lui prend 2 char* en argument et renvoit un entier.
 
pas d'incohérence dans se que je dis jusqu'ici ?

Reply

Marsh Posté le 06-04-2004 à 14:17:34    

ben ça c'est la documentation ... d'autres platitudes à dire ?

Reply

Marsh Posté le 06-04-2004 à 14:22:35    

platitude.. lol
 
enfait se que je ne saisi pas c'est l'écriture  
 
strncmp(*(char**)a, *(char**)b); dans le cas du tris d'un tableau de pointeur.
 
et strncmp((char*)a, (char*)b); dans le cas du tris d'un [][]

Reply

Marsh Posté le 06-04-2004 à 14:22:35   

Reply

Marsh Posté le 06-04-2004 à 14:26:40    

déjà y a pas de n
déjà on elève pas les const comme ça
 
après, c'est juste une histoire de types [:spamafote]

Reply

Marsh Posté le 06-04-2004 à 14:36:43    

oups oui pour le n,  
 
je pensse que le problème c'est que j'interprète mal *(char**)a ou meme (char*)a  
 
c'est serait pas un typage par hasard parcequ'a la base a était un void* ?

Reply

Marsh Posté le 06-04-2004 à 14:41:17    

ben c'est un cast ...

Reply

Marsh Posté le 06-04-2004 à 14:55:02    

mmm ok...
 
donc...
 
dans le premier cas a est un pointeur de pointeur de char et strcmp compare se qu'il pointe donc un pointeur de char.
 
et dans le second cas a est un pointeur de char et strcmp compare ce pointeur de char donc c logique...
 
(correction)
 


Message édité par push le 06-04-2004 à 14:56:23
Reply

Marsh Posté le 06-04-2004 à 14:58:40    

se qui me ramène au problème de base *(char **) a ce n'est pas la meme chose que (char *)a et je vois pas la diff pff

Reply

Marsh Posté le 06-04-2004 à 15:00:05    

ben parce que le void* permet une certain généricité, en gros ça pointe vers n'importe quoi : à toi de savoir ce que c'est vraiment et comment t'en servir

Reply

Marsh Posté le 06-04-2004 à 15:33:10    

si a est un char ** et que je fais une comparaison sur *a
 
ou que a soit un char * et que je face la comparaison sur a
 
je vois pas de différence, ya quelque chose qui m'échappe la.

Reply

Marsh Posté le 06-04-2004 à 15:35:07    

ben ton dernier message est clairement l'explication

Reply

Marsh Posté le 06-04-2004 à 15:42:41    

si tu le dis  :D  
 
mais pq c'est 2 écritures differentes dans le cas du p[][] et *p[]  :??:

Reply

Marsh Posté le 06-04-2004 à 15:46:10    

parce que c'est pas la même chose ... tu le fais exprès ou quoi?

Reply

Marsh Posté le 06-04-2004 à 15:54:02    

non même pas  :sweat:  
 
"parce que l'un est contigu, l'autre nécessite un dereferencement"
 
j'ai aucune idée de se que ca peut signifier et encore moin de l'effet que ca à sur mes écritures dans mon strcmp.
 
merci de ta patience sinon  :whistle:

Reply

Marsh Posté le 06-04-2004 à 15:56:33    

le français sinon ?  
 

Taz a écrit :

bon allez, qui me colle la définition d'un tableau?

t'es aussi visé, une petite recherche ...
 

Taz a écrit a écrit :

ben contigü et dereferencer, ben *pointeur




Message édité par Taz le 06-04-2004 à 15:56:50
Reply

Marsh Posté le 06-04-2004 à 15:56:55    

Avec un déréférencement le tri sera plus long. si les éléments sont contigus, ça sera plus rapide en mémoire donc à trier

Reply

Marsh Posté le 06-04-2004 à 15:58:06    

JagStang a écrit :

Avec un déréférencement le tri sera plus long. si les éléments sont contigus, ça sera plus rapide en mémoire donc à trier

ouais, là tu nous fait de la bonne parano

Reply

Marsh Posté le 06-04-2004 à 15:59:31    

ta gueule :o
 
edit : :D


Message édité par jagstang le 06-04-2004 à 15:59:57
Reply

Marsh Posté le 06-04-2004 à 16:01:03    

t'as oublié que ça gaché la mémoire de manière inacceptable aussi

Reply

Marsh Posté le 06-04-2004 à 16:14:11    

bein un tableau p[i] ca équivaut à *(p+i)
 
je vois pas trop se que je pourrais découvrire sur les tableaux, je vais revoir ca mais bon  :heink:

Reply

Marsh Posté le 06-04-2004 à 16:15:55    

ben ça c'est juste une histoire de notation ... je vois pas ce que tu conclus

Reply

Marsh Posté le 06-04-2004 à 16:19:02    

push>> où sont stocké les données de ton tableau, pour chaque notation
 
p[][]
et  
*p[]
et
**p

Reply

Marsh Posté le 06-04-2004 à 16:20:13    

compter pas sur moi pour recoller ma définition un peu complète d'un tableau, c'est pas à moi de faire les recherches, c'est à ceux qui posent les questions [:spamafote]

Reply

Marsh Posté le 06-04-2004 à 16:20:32    

bein je conclus rien  :D  
 
j'essayais juste de trouver des pistes pour différencier p[][] et p*[]
 
enfin je vais continuer sur la piste "qu'est-ce qu'un tableau" alors.

Reply

Marsh Posté le 06-04-2004 à 16:24:25    

Reply

Marsh Posté le 06-04-2004 à 16:26:04    

Reply

Marsh Posté le 06-04-2004 à 16:26:07    

me dis pas qu'il faudrait écrire une FAQ ...

Reply

Marsh Posté le 06-04-2004 à 16:30:22    

JagStang a écrit :

push>> où sont stocké les données de ton tableau, pour chaque notation
 
p[][]
et  
*p[]
et
**p
 


 
en mémoire  :lol:  
 
non aller  :cry:  
 
hum, quand on créer un tableaui p[][] on définis d'une manière ou d'une autre sa taille, il aura de de la mémoire alloué pour ca, apres p*[] un tableau de pointeur bein c la même chose non ? on définis la taille de chaque pointeur si on veut mettre des données dedans.
 
enfin c bien confus quoi ces pointeurs enfait  :sarcastic:  

Reply

Marsh Posté le 06-04-2004 à 16:30:44    

je vais voir tes liens

Reply

Marsh Posté le 06-04-2004 à 16:32:29    

j'aime bien t'as façon de penser ... c'est la même chose pourtant tu les définis pas pareil ...

Reply

Marsh Posté le 06-04-2004 à 16:32:42    

Taz a écrit :

me dis pas qu'il faudrait écrire une FAQ ...


tu pourrais écrire un bouquin [:cupra] [:ddr555]


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

Marsh Posté le 06-04-2004 à 16:37:34    

chiche, si je trouve pas de travail cet été ... je pourrais faire un petit essai

Reply

Marsh Posté le 06-04-2004 à 16:40:52    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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