Pointeurs et tableaux 2D en C

Résolu
jcl571 -  
jcl571 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je sais que l'équivalent en pointeur d'un tableau en 1 dimension donne quelque chose comme ça:
&tab[i] = tab
car tab seul est un pointeur sur le premier élément du tableau.

J'ai fait des test sur des tableaux en 2 dimensions et j'en ai conclu que l'équivalent de:
&tab[i][j] n'est pas tab
Je voudrais donc savoir quel est l'équivalent pour un tableau à 2 dimensions?

La raison est que je voudrais passer mon tableau 2D à une fonction et, question de simplifier l'écriture lorsque j'appellerai la fonction(car toujours écrire &tab[i][j] c'est moins pratique que juste écrire tab)(et sauver de la mémoire, tant qu'a y etre!), je voudrais simplement passer un pointeur qui pointe sur le premier élément.

Merci, j'espere que j'ai été assez clair :P
A voir également:

4 réponses

Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention   25
 
Je corrige :

&tab[0] = tab

tab[0] est le premier élément et & est l'opérateur d'adresse.

Pour un tableau à deux dimension ça marche pareil,

&tab[0][0] = tab

Tu peux donc passer juste tab à ta fonction.
Il faut par contre que le prototype de la fonction (sa définition) soit correcte.
3
Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention   25
 
Un exemple :

void zero(int **t)
{
int i,j;
for(i=0; i<2; i++)
for(j=0; j<3; j++)
t[i][j]=0;
};

void main()
{
int tab[2][3];
zero(tab);
};

Je l'ai pas compilé mais bon ça devrait être ok.
1
jcl571
 
Tu as parfaitement raison pour ce qui est de &tab[0] = tab et non &tab[i], merci de la correction :)

Et j'avais fait un mauvais test pour vérifier l'équivalent, &tab[0][0] est bien équivalent a tab. Je l'avais bien deviné mais j'avais bloqué pour passer le tableau à une fonction, car j'obtiens les 2 warning suivants(ces warning sont obtenus avec la fonction test que tu m'a donnée, mais j'obtiens les même avec mes fonctions):

warning C4047: 'function' : 'int ** ' differs in levels of indirection from 'int [2][3]'
warning C4024: 'zero' : different types for formal and actual parameter 1

Est-ce qu'il y a moyen de ne pas avoir ces warning?(ça marche quand même, mais ça m'irrite d'avoir des warning :P)
0
Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention   25
 
Sans promesses, j'ai pas de compilo sous la main pour tester,

Tu as deux choix, changer le prototype (j'en suis pas tout à fait certain) :

void zero(int t[][])

Ou alors lors de l'appel et mets :

zero((int**)tab);

Ce qui transforme ton tableau à deux dimension en un pointeur de pointeur.
0
jcl571 > Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention  
 
Si je change le prototype pour void zero(int t[][50]) (la 2e dimension doit etre mentionnée si je me souviens bien), est-ce que ça recopie tout le tableau ou seulement l'adresse de la première case?
0
Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention   25 > jcl571
 
Je sais pas trop.
J'utilise toujours des pointeurs, comme ça je suis sûr ;-)
0
jcl571 > Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention  
 
C'est ce que j'aimerais faire, mais en plus d'être irritants, les warning sont fortement pénalisés lors de la correction ;)
0
Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention   25 > jcl571
 
Fais :

int tab[2][3];

void zero(int **t)
{
...
}

void main()
{
zero( (int**) tab);
}

Et tu devrais plus avoir de warning.
0
jcl571 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
En fait, je ne me sers pas de tableaux de taille 2 et 3, c'était seulement comme exemple :) Mes tableaux sont des tableaux de chaines de caractères de taille 100x51 (des listes de noms et de prénoms).
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ca change rien. Tu fais passer toujours la taille et l'appel est le même ;)
0
jcl571 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Je sais :) En tout cas, merci pour tout! Résolu! :)
0