Pointeurs et tableaux 2D en C

Résolu/Fermé
jcl571 - 18 nov. 2008 à 03:52
jcl571 Messages postés 36 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 12 août 2009 - 18 nov. 2008 à 19:22
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

4 réponses

Droopy_ Messages postés 248 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009 26
18 nov. 2008 à 04:11
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009 26
18 nov. 2008 à 04:22
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
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009 26
18 nov. 2008 à 16: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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009
18 nov. 2008 à 18:05
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009 26 > jcl571
18 nov. 2008 à 18:10
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009
18 nov. 2008 à 18:12
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009 26 > jcl571
18 nov. 2008 à 18:14
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 mardi 18 novembre 2008 Statut Membre Dernière intervention 12 août 2009
18 nov. 2008 à 19:07
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 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 813
18 nov. 2008 à 19:10
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 mardi 18 novembre 2008 Statut Membre Dernière intervention 12 août 2009 > fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
18 nov. 2008 à 19:22
Je sais :) En tout cas, merci pour tout! Résolu! :)
0