Lorsque j'ai besoin de transmettre un tableau à une fonction, il semble que toutes les déclarations suivantes de la fonction fonctionnent pour ceci: p> mais lorsque j'identifie un tableau à un autre tableau, il échoue p> alors pourquoi un tableau passé comme argument d'une fonction est correct, mais utilisé sur le RHS de simple affectation est faux? p> p>
7 Réponses :
void f(int *arr);
Oui, cependant (en C99) VOID F (int Arr [statique 4]) {...} code> est spécial car cela permet au compilateur de supposer que
arr compiler code> est non-
null code> et a une taille au moins 4.
c ne prend pas en charge l'affectation de tableaux. Dans le cas d'un appel de fonction, la matrice se désintègre à un pointeur. C soutenir l'affectation des pointeurs. Ceci est interrogé ici à peu près tous les jours - Qu'est-ce que le livre de texte C est votre lecture qui ne veut pas expliquer cela? P>
Essayez memcpy.
int a[]={1,2,3,4}; int b[4]; memcpy(b, a, sizeof(b));
MemCy (B, A, 4 * Taille de taille (int) code>. ou
Tailleof (B) code>.
Pour comprendre la différence, nous devons comprendre deux contextes différents em>. Quel est le contexte de l'objet? p> dans Maintenant que nous avons cette connaissance, lorsque nous le faisons: p> c'est Exactement em> équivalent à p> Comme vous l'avez découvert, nous pouvons omettre la taille (4 ci-dessus) de la déclaration de fonction. Cela signifie que vous ne pouvez pas connaître la taille de la "matrice" transmise à dans l'appel de la fonction, le nom Dans le cas de p> Le nom maintenant, si vous voulez copier em> le contenu de ou, si vous vouliez un pointeur
t code> est équivalent à un pointeur pour taper
t code> et est égal à un pointeur sur le premier élément de la matrice. LI>
t code> ne diminue pas à un pointeur. LI>
ul>
A = B; code>,
A code> est dans le contexte de l'objet. Lorsque vous avez pris l'adresse d'une variable, elle est utilisée dans le contexte de l'objet. Enfin, lorsque vous utilisez
Tailleof code> Opérateur sur une variable, il est utilisé dans le contexte de l'objet. Dans tous les autres cas, une variable est utilisée dans le contexte de la valeur. P>
f () code>. Plus tard, lorsque vous faites: p>
A code> est dans le contexte de la valeur, de sorte qu'il réduit à un pointeur sur
INT code>. C'est bon, car
f code> attend un pointeur à un
int code>, donc la définition de la fonction et l'utilisation correspondance. Ce qui est transmis à
f () code> est le pointeur sur le premier élément de
A code> (
et a [0] code>). P>
B code> est utilisé dans un contexte d'objet et ne réduit pas à un pointeur. (Incidemment,
A code> ici est em> dans un contexte de valeur et réduit à un pointeur.) P>
int b [4]; code> attribue la valeur de stockage de 4
int code> s et donne le nom
B code>.
A code> a également été attribué un stockage similaire. Donc, en effet, le moyen d'affectation ci-dessus signifie "Je veux rendre l'emplacement de stockage identique à l'emplacement précédent". Cela n'a pas de sens. P>
a code> dans
b code>, alors vous pouviez faire: p>
b code> qui pointe vers
a code>: p>
int a[4] = {1, 2};
Pouvez-vous fournir une référence sur l'endroit où vous lisez sur les contextes d'objet et de valeur? Je suis intéressé à lire plus.
Je n'ai jamais entendu parler de "contexte d'objet" vs "contexte de valeur".
Un "contexte d'objet" est fondamentalement "une expression qui attend un rvalue" et "contexte de valeur" est "une expression qui attend un lvalue", officiellement. Toutes les appels de fonctions dans C prennent leurs paramètres en tant que rvalues (= "par valeur") et renvoient une rapalité, et les opérateurs varient. C'est à dire. OP = a besoin de LValue LHS et de RVALUE RHS, 1-ARG OP * prend de la remparte et renvoie Lvalue, 2-Arg Op + et Op- prennent et retourne des rapides, etc.
Pour obtenir votre intuition à ce sujet, vous devez comprendre ce qui se passe au niveau de la machine. P>
La sémantique d'initialisation (= {1,2,3,4}) signifie "Mettez-le sur votre image binaire exactement de cette façon" afin que cela puisse être compilé. P>
L'affectation du tableau serait différente: le compilateur devrait le traduire en boucle, ce qui serait réellement
Notez que le type de mais type de em> ( Notez également que le type de la valeur a code> in
int A [4] code> est
int [4] code>.
& a code>) ==
int (*) [4] code>! =
int [4] p>
A code> est
int * code>, qui est distinct de tout ce qui précède! P> < P> Voici un exemple de programme que vous pouvez essayer: p>
Vous devez utiliser "% zu" pour imprimer Taille_T (en C99).
Je veux clarifier. Il y a quelques astuces trompeuses dans les réponses ... toutes les fonctions suivantes peuvent prendre des tableaux entier: mais arguments formels strong> ne sont pas les mêmes. Donc, le compilateur peut les gérer différemment. Dans le sens de la gestion de la mémoire interne, tous les arguments mènent à des pointeurs. P> ... f () prend une matrice de toutes tailles. P> void f(int *arr)
Le titre de la question doit être réécrit, l'un actuel est excessivement générique et minuscule.