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 de la fonction principale

#include  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  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 ===| 

Dans votre nouveau code,

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

B est un pointeur sur int , donc B[0] est un int et vous ne pouvez pas déréférencer un int . Retirez juste le * ,

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

et il fonctionne.

Dans l’initialisation

 int B[10] = {NULL}; 

vous initialisez un 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. Le compilateur en avertit donc.

 int B[10] = {0}; 

est le bon moyen de 0-initialiser un int[10] .

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

 #include  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; } 

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

 #include  int 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, il n’est pas si commun de faire cela. Habituellement, 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.

 int 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é int B[5][10] , int B[][10] , int (*B)[10] , tous sont équivalents en tant que types de parameters.

Addendum: vous pouvez retourner un pointeur sur un tableau à partir d’une fonction, mais la syntaxe pour déclarer la fonction est très gênante, la partie [10] du type doit se trouver après la liste de parameters:

 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; } 

Dans la nouvelle atsortingbution 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 sauvegardée.

 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; } 

Dans la déclaration de fonction, vous devez taper comme

 VOID FUN(INT *a[]); /*HERE YOU CAN TAKE ANY FUNCTION RETURN TYPE HERE I CAN TAKE VOID AS THE FUNCTION RETURN TYPE FOR THE FUNCTION FUN*/ //IN THE FUNCTION HEADER WE CAN WRITE AS FOLLOWS void fun(int *a[]) //in the function body we can use as a[i]=var