#include <stdio.h>
int main()
{
int ary[2][3];
foo(ary);
}
void foo(int (*ary)[3])
{
int i = 10, j = 2, k;
ary[0] = &i;
ary[1] = &j;
for (k = 0;k < 2; k++)
printf("%d\n", *ary[k]);
}
I tried it with many different compilers but I do not understand why this will not compile.
3 Réponses :
Dans un tableau en langage C, la structure et l'union passent toujours par référence. Le langage C ne vérifie pas strictement le type de référence et prend également en charge le cast implicite.
void foo (int (* ary) [3]) c'est une syntaxe de passage d'une fonction à une fonction comme référence (fonction de rappel). mais vous essayez d'attribuer une valeur à une fonction qui est implicitement convertie par c n'a pas d'importance, vous passez une référence de tableau. c'est pourquoi il affiche une erreur de valeur.
LValue implique que si vous attribuez une valeur à l'aide de l'opérateur d'affectation (=), le côté gauche doit être une variable, mais dans votre cas, il s'agit d'une référence de rappel.
J'espère que son aide.
Dans la matrice de langage C, Structure et Union passe toujours avec référence Code> - Non, ils sont toujours passés par la valeur. Non Vérifiez strictement Type de référence Code> - Il n'existe pas de "type de référence" en langage C, un pointeur sur une variable transmis à une fonction est couramment reconditionné comme référence. Il s'agit d'une syntaxe de transmettre une fonction à une fonction comme référence code> - non, pas du tout, c'est une déclaration de fonction normale qui prend un pointeur sur un tableau de 3 int code> s comme un argument. Ce n'est pas une "fonction de rappel" (ou peut-être que c'est - veuillez définir ce terme).
exécutez ce programme et vous comprenez que le tableau est vraiment passé par valeur ou référence int main () {int arr [] = {1,2,3}; printf ("% d \ n", arr); printf ("% d \ n", & arr); checkCallByValueOrRefernce (arr); return 0; } checkCallByValueOrRefernce (int * arr) {printf ("% d \ n", arr); printf ("% d \ n", & arr); }
veuillez vous référer à qsort (...) qui est le meilleur exemple de fonction de rappel en langage C.
#include <stdio.h>
void foo(int (*ary)[3]);
int main()
{
int ary[2][3];
int (*x)[3] = &ary[0];
foo(&ary[0]);
}
void foo(int (*ary)[3])
{
int i = 10, j = 2, k;
*ary[0] = i;
*ary[1] = j;
for (k = 0;k < 2; k++)
printf("%d\n", *ary[k]);
}
je ne veux pas corriger mon code. Je suis intéressé de savoir pourquoi ce code se comporte comme ça.
Peut-être que vous ne voulez pas mais vous en avez besoin. Voyez la différence et réfléchissez
Vous attribuez une expression avec un type de tableau.
ary à l'intérieur de toto est une variable de type "pointeur vers un tableau de trois int s".
Lorsque vous lui assignez, vous essayez d'attribuer une variable de type "pointeur vers int " à une variable de type "tableau de trois int s" .
Ceci n'est pas valide car un tableau n'est pas une lvalue < / a> (6.3.2.1p3):
Sauf s'il s'agit de l'opérande de l'opérateur sizeof, de l'opérateur
_Alignof, ou de l'opérateur unaire&, ou s'il s'agit d'une chaîne littérale utilisée pour initialiser un tableau, un expression qui a le type "tableau de type" est convertie en une expression avec le type "pointeur vers le type" qui pointe vers l'élément initial de l'objet tableau et n'est pas une lvalue. Si l'objet tableau a une classe de stockageregister, le comportement n'est pas défini.