Dans le code suivant, je voudrais mieux comprendre ce qui se passe avec int * z = malloc (Tailleof (int);
pour moi qui crée un pointeur sur un int. puis * z obtient la somme de la valeur. que x pointe sur (2) et la valeur que y indique (4). p>
maintenant * z = 6. Cela signifie-t-il * z ne pointe-t-il rien? Il stocke un int? Je pensais * Z était un pointeur et un pointeur est une adresse? Merci à toute connaissance de l'aide. P>
int *add(int *x, int *y)
{
int *z = malloc(sizeof(int));
*z = (*x) + (*y);
return z;
}
int main(void)
{
int a = 2;
int b = 4;
int *ptr = add(&a, &b);
printf("sum = %i\n", *ptr);
}
3 Réponses :
Imaginez votre mémoire comme, conceptuellement, un certain nombre d'octets dont chacun a un numéro. Un pointeur sur un C'est aussi pourquoi les pointeurs peuvent être délicats et frustrants. Ils introduisent indirects em> dans votre code. P>
1 sup> in c Les pointeurs sont également largement interchangeables avec des tableaux afin que vous puissiez faire * z = 6 code> attribue 6 code> à l'emplacement pointé sur em> par PTR code>. C'est ce que fait un pointeur, cela pointe des choses, mais afin de mettre une valeur à l'endroit où elle pointe par opposition à la modification du pointeur, vous devez désaffecter l'opérateur * code>. 1 sup> p>
int code> représente un emplacement particulier dans la mémoire qui est présumé pour contenir un int code> ou 4 octets de données. P>
* z = 6 code> signifie "Mettez une valeur entière de 6 dans l'emplacement de la mémoire décrite par z code>", qui se traduit par des instructions de la machine largement identiques. < / p>
z code> absolument pas "stocker un int", il stocke un emplacement. Cet emplacement peut exister ou peut être null code> ou peut être invalide. Il n'y a aucune garantie à moins que vous ne vérifiez votre code soigneusement pour vous assurer que le pointeur est valide. C'est votre responsabilité en tant que programmeur. P>
z [0] = 6 code>, bien que z code> à un seul int, tout index autre que 0 est invalide. P>
Donc, z stocke l'adresse où 6 est situé .. Alors * PTR obtient z .. Alors maintenant * PTR = (adresse où se trouve le 6). Qu'advient-il de * z? Est-ce que cela ne pointe plus rien?
Si vous voulez creuser plus profondément, alors c'est génial. Essayez de regarder le Langue d'assemblage sortie de ce code lors de la compilation. Comprendre les instructions du processeur contribue beaucoup à comprendre pourquoi C est conçu comme il est. Il existe une instruction qui dit, efficacement, "Mettez cette valeur dans cet emplacement de mémoire" ainsi que celle qui dit "Lire de cet emplacement de mémoire". z code> lui-même n'est pas consommé. C'est toujours là. Vous pouvez faire int A = * z code> aussi facilement que possible * z + = 2 code>.
@Dylan No. * PTR = 6 code> stocke la valeur 6 de l'emplacement référencé par PTR code>. PTR code> Points toujours au même endroit.
Pensez à z code> en tant que "INTEGER INDIRECT", comme dans vous besoin de la désarférence pour en obtenir un. z + 6 code> fait le pointeur mathématique. * z + 6 code> fait entier mathématiques.
N'oubliez pas que tout en C dans C a une adresse mémoire, de côté, de côté, donc int z code> est également un emplacement de mémoire, vous pouvez toujours faire int * zptr = & z code>, puis vous Vous avez un pointeur qui peut manipuler cette valeur, aucun malloc code> requis.
@Williampursell Désolé .... SO z = (adresse où se trouve 6 est localisé) .. Ensuite, l'adresse où le 6 est situé est transmis à PTR. Donc, une fois PTR = adresse où 6 est situé, qu'advient-il de z?
Rien, ça fait une copie. Vous pouvez copier des pointeurs et les modifier autant que vous le souhaitez, bien que gardez à l'esprit le résultat de la modifier arbitrairement ne peut pas nécessairement être valable.
Que se passe-t-il lorsque vous faites int x = 5 code>, puis int y = x code>? Même chose. C'est juste une copie. Les pointeurs ne sont pas spéciaux, ils ont simplement des pouvoirs quelque peu magiques car vous pouvez changer de choses à travers i> eux.
@Dylan Ce n'est pas "Z = (adresse où 6 est lcancé)". Au lieu de cela, * z = 6 code> doit être interprété comme "stocker la valeur 6 à l'emplacement indiqué par Z". D'autre part, z = & x code> est "z = l'adresse de x" et * z = x code> est "stocker la valeur actuellement tenue par x à l'adresse actuelle tenue par z "
int* add(int *x, int *y)
{
int *z = NULL;
if(x && y)
{
z = malloc(sizeof(int));
if(z)
{
*z = (*x) + (*y);
}
}
return z;
}
maintenant * z = 6. Cela signifie-t-il * z ne pointe-t-il rien? Il stocke un int? Je pensais * z était un pointeur et un pointeur est une adresse? Merci de toute connaissance de l'aide. P> blockQuote>
Vous êtes correct avec
* z = 6 code> Cependant, vous vous trompez avec la façon dont cela se produit. P>
z code> est un pointeur et il pointe donc quelque part dans la mémoire. Plus tôt dans votre programme, avecint * z = malloc (tailleof (int)); code> Vous avez alloué un espace lez code> pointe vers. P>alors quand vous avez fait
* z = (* x) + (* y); code> Vous avez essentiellement le résultat de l'addition dans cet espace alloué. P>
z code> est toujours pointé vers cet espace (car c'est un pointeur).* z code> est appelé la déséroferience et a une signification d'atteindre directement pour la valeur que le pointeur pointe. p>En d'autres termes: le
6 code> est stocké dans un endroit lez code> points sur et* z code> est un moyen de saisir cette valeur. p>
* z code> Derefences i> Le pointeur vous permettant de lire / écrire sur l'emplacement de mémoire pointu. N'oubliez pas degratuit (PTR) code> dansprincipale code> pour relâcher la mémoire que vousmasloc code> 'd. En outre, cet exemple est assez gravement artificiel. IRL Vous feriez tout simplement tout cela sans points de pointe, Stack attribue tout et utilisez la valeur de retour entier directement, alors peut-être que ce n'est pas une très bonne motivation pour laquelle vous auriez besoin de savoir.Peut-être un point subtil, mais
z = malloc (taille de (int)) code> ne crée pas le pointeur. Il alloue ("Crée" n'est pas précis, mais je suppose que vous seriez utilisé de manière collaborative) la mémoire et attribue l'adresse de la mémoire allouée àz code>.* z code> n'est pas un pointeur.z code> est un pointeur.* z code> est la valeur stockée à l'adresse à laquellez code> points. Un pointeur n'est pas une adresse; C'est une variable qui contient une adresse.