2011-09-02 3 views
-2

Bien que nous déclarions une fonction avec un tableau d'entiers, nous passons l'adresse du tableau à la fonction. Dans le cas d'entiers simples, il donne une erreur si nous passons l'adresse, nous obtenons une erreur de conversion de pointeur. Mais comment il est possible dans le cas d'un tableauPasser un tableau à une fonction dans C

#include<stdio.h> 
void print_array(int array[][100],int x, int y); 
main() 
{ 
    int i,j,arr[100][100]; 
    printf("Enter the array"); 
    for(i=0;i<2;i++) 
    { 
     for(j=0;j<2;j++) 
     { 
      scanf("%d",&arr[i][j]); 
     } 
    } 
    print_array(arr,i,j); 

} 

void print_array(int array[][100],int x,int y) 
{ 
    int i,j; 
    printf("\nThe values are\n"); 
    for(i=0;i<x;i++) 
    { 
     for(j=0;j<y;j++) 
     { 
      printf("%d",array[i][j]); 
     } 
    } 
} 

Ma question est même si notre fonction est déclarée comme l'un avec tableau entier comme premier paramètre (ici) nous passons l'adresse de tableau quand nous appelons la fonction. Comment ça fonctionne?

+1

Quel genre d'erreur obtenez-vous? Voici un exemple de code sans erreur: https://www.ideone.com/CAEoi. En fait, je peux exécuter le code que vous avez écrit et il donne aussi ce que j'attends https://www.ideone.com/3z1JO –

+0

de votre extrait de code, vous finirez par passer en x et y comme 2 puisque vous utilisez ceux dans votre boucle for où vous lisez des valeurs. Vous aussi vous initialisez seulement un [0] [0], un [0] [1], un [1] [0], un [1] [1] avec des données, le reste du tableau va juste être indésirable (à la hausse, vous imprimez seulement ce que vous avez initialisé). – pstrjds

+0

@pstrjds Ma question ne concerne pas l'erreur. C'est à propos de la logique derrière son fonctionnement. Question maintenant mise à jour. J'espère que c'est plus clair maintenant – user567879

Répondre

-1

Vous passez le tableau, pas son adresse. arr est un int [] [] tableau (en fait, il est assez similaire à &(arr[0]), qui est un pointeur vers (l'adresse de) la première ligne de votre tableau.En C, il n'y a pas de différence pratique entre un tableau et le pointeur correspondant, sauf que vous prenez son adresse avec l'opérateur &)

Edit:. Ok, pour me rendre clair:

#include <stdio.h> 

int fn(char p1 [][100], char (*p2)[100]) 
{ 
    if (sizeof(p1)!=sizeof(p2)) 
    printf("I'm failed. %i <> %i\n",sizeof(p1),sizeof(p2)); 
    else 
    printf("Feeling lucky. %i == %i\n",sizeof(p1),sizeof(p2)); 
} 

int main() 
{ 
    char arr[5][100]; 
    char (*p)[100]=&(arr[0]); 
    fn(arr, arr); 
    fn(p, p); 
    return 0; 
} 
+1

'int [] []' n'est pas un type valide. 'int [] [100]' est, ce qui est ce qu'il utilise. Et le tableau se désintègre en '& (arr [0] [0])' (votre note sur l'adresse du premier élément est correcte, il vous manquait simplement un index). –

+0

Oui, je voulais dire int [] [n], mais comme n était hors de propos ici, j'ai omis, car cela n'affecterait pas l'explication. Et l'index ne manquait pas. arr _is_ égal à & (arr [0]). – vmatyi

+0

* n * n'est pas indifférent, c'est absolument nécessaire pour le calcul offset. De plus, '& (arr [0])' n'est pas valide, car vous ne pouvez pas prendre l'adresse d'un rvalue. Enfin, vous avez tort quand vous dites qu'il n'y a pas de différence pratique. Bien que les tableaux se désintègrent automatiquement en pointeurs, ils sont très différents. Par exemple, 'sizeof (arr)' n'est pas la taille d'un pointeur. –

Questions connexes