web-dev-qa-db-fra.com

C passer int pointeur de tableau en tant que paramètre dans une fonction

Je veux passer le pointeur de tableau B int dans la fonction func et pouvoir le modifier à partir de là, puis afficher les modifications apportées à la fonction principale

#include <stdio.h>

int func(int *B[10]){

}

int main(void){

    int *B[10];

    func(&B);

    return 0;
}

le code ci-dessus me donne des erreurs:

In function 'main':|
warning: passing argument 1 of 'func' from incompatible pointer type [enabled by default]|
note: expected 'int **' but argument is of type 'int * (*)[10]'|

EDIT: Nouveau code:

#include <stdio.h>

int func(int *B){
    *B[0] = 5;
}

int main(void){

    int B[10] = {NULL};
    printf("b[0] = %d\n\n", B[0]);
    func(B);
    printf("b[0] = %d\n\n", B[0]);

    return 0;
}

maintenant je reçois ces erreurs:

||In function 'func':|
|4|error: invalid type argument of unary '*' (have 'int')|
||In function 'main':|
|9|warning: initialization makes integer from pointer without a cast [enabled by default]|
|9|warning: (near initialization for 'B[0]') [enabled by default]|
||=== Build finished: 1 errors, 2 warnings ===|
26
fxuser

Dans votre nouveau code,

int func(int *B){
    *B[0] = 5;
}

B est un pointeur sur int, donc B[0] est une int et vous ne pouvez pas déréférencer une int. Il suffit de supprimer le *,

int func(int *B){
    B[0] = 5;
}

et il fonctionne.

Dans l'initialisation

int B[10] = {NULL};

vous initialisez une int avec un void* (NULL). Puisqu'il existe une conversion valide de void* à int, cela fonctionne, mais ce n'est pas tout à fait casher, car la conversion est définie par l'implémentation et indique généralement une erreur du programmeur.

int B[10] = {0};

est le moyen approprié pour 0-initialiser un int[10].

34
Daniel Fischer

Peut-être que tu essayais de faire ça?

#include <stdio.h>

int func(int * B){

    /* B + OFFSET = 5 () You are pointing to the same region as B[OFFSET] */
    *(B + 2) = 5;
}

int main(void) {

    int B[10];

    func(B);

    /* Let's say you edited only 2 and you want to show it. */
    printf("b[0] = %d\n\n", B[2]);

    return 0;
}
11
Alberto Bonsanto

Si vous voulez réellement passer un pointeur de tableau, c'est

#include <stdio.h>

void func(int (*B)[10]){   // ptr to array of 10 ints.
        (*B)[0] = 5;   // note, *B[0] means *(B[0])
         //B[0][0] = 5;  // same, but could be misleading here; see below.
}

int main(void){

        int B[10] = {0};   // not NULL, which is for pointers.
        printf("b[0] = %d\n\n", B[0]);
        func(&B);            // &B is ptr to arry of 10 ints.
        printf("b[0] = %d\n\n", B[0]);

        return 0;
}

Mais comme mentionné dans d'autres réponses, ce n'est pas si courant de le faire. En général, un pointeur vers un tableau est transmis uniquement lorsque vous souhaitez passer un tableau 2D, où il apparaît soudainement beaucoup plus clair, comme indiqué ci-dessous. Un tableau 2D est en fait passé en tant que pointeur sur sa première ligne.

void func( int B[5][10] )  // this func is actually the same as the one above! 
{
         B[0][0] = 5;
}

int main(void){
    int Ar2D[5][10];
    func(Ar2D);   // same as func( &Ar2D[0] )
}

Le paramètre de func peut être déclaré en tant que int B[5][10], int B[][10], int (*B)[10], tous sont équivalents en tant que types de paramètres. 

Addendum: vous pouvez retourner un pointeur sur un tableau à partir d'une fonction, mais la syntaxe permettant de déclarer la fonction est très compliquée, la partie [10] du type doit se trouver après la liste de paramètres:

int MyArr[5][10];
int MyRow[10];

int (*select_myarr_row( int i ))[10] { // yes, really
   return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}

Ceci est généralement fait comme ci-dessous, pour éviter la fatigue oculaire:

typedef int (*pa10int)[10];

pa10int select_myarr_row( int i ) {
   return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}
4
greggo

Dans la nouvelle attribution de code devrait être,

B[0] = 5

Dans func (B), vous ne faites que passer l'adresse du pointeur qui pointe vers le tableau B. Vous pouvez changer de fonction dans func () en tant que B [i] ou * (B + i). Où i est l'indice du tableau.

Dans le premier code, la déclaration dit: 

int *B[10]

dit que B est un tableau de 10 éléments, chaque élément étant un pointeur sur un int. Autrement dit, B [i] est un pointeur int et * B [i] est le nombre entier qu’il pointe vers le premier entier de la i-ème ligne de texte enregistrée. 

1
Sunil Bojanapally
main()
{
    int *arr[5];
    int i=31, j=5, k=19, l=71, m;

    arr[0]=&i;
    arr[1]=&j;
    arr[2]=&k;
    arr[3]=&l;
    arr[4]=&m;

    for(m=0; m<=4; m++)
    {
        printf("%d",*(arr[m]));
    }
    return 0;
}

En utilisant l’excellent exemple de Greggo, j’ai réussi à faire cela comme une sorte de bulle, en passant un tableau sous forme de pointeur et en effectuant une simple manipulation -1.

#include<stdio.h>

void sub_one(int (*arr)[7])
{
     int i; 
     for(i=0;i<7;i++)
    {
        (*arr)[i] -= 1 ; // subtract 1 from each point
        printf("%i\n", (*arr)[i]);

    }

}   

int main()
{
    int a[]= { 180, 185, 190, 175, 200, 180, 181};
    int pos, j, i;
    int n=7;
    int temp;
    for (pos =0; pos < 7; pos ++){
        printf("\nPosition=%i Value=%i", pos, a[pos]);
    }
    for(i=1;i<=n-1;i++){
        temp=a[i];
        j=i-1;
        while((temp<a[j])&&(j>=0)) // while selected # less than a[j] and not j isn't 0
        {
            a[j+1]=a[j];    //moves element forward
            j=j-1;
        }
         a[j+1]=temp;    //insert element in proper place
    }

    printf("\nSorted list is as follows:\n");
    for(i=0;i<n;i++)
    {
        printf("%d\n",a[i]);
    }
    printf("\nmedian = %d\n", a[3]);
    sub_one(&a);

    return 0;
}

Je dois savoir comment encapsuler des pointeurs, car cela m'a jeté à terre.

0
G_L