0
votes

Nouveau aux pointeurs en C

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


2 commentaires

* z Derefences Le pointeur vous permettant de lire / écrire sur l'emplacement de mémoire pointu. N'oubliez pas de gratuit (PTR) dans principale pour relâcher la mémoire que vous masloc '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)) 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 . * z n'est pas un pointeur. z est un pointeur. * z est la valeur stockée à l'adresse à laquelle z points. Un pointeur n'est pas une adresse; C'est une variable qui contient une adresse.


3 Réponses :


0
votes

* z = 6 attribue 6 à l'emplacement pointé sur par PTR . 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 * . 1

Imaginez votre mémoire comme, conceptuellement, un certain nombre d'octets dont chacun a un numéro. Un pointeur sur un int représente un emplacement particulier dans la mémoire qui est présumé pour contenir un int ou 4 octets de données.

* z = 6 signifie "Mettez une valeur entière de 6 dans l'emplacement de la mémoire décrite par z ", qui se traduit par des instructions de la machine largement identiques. < / p>

z absolument pas "stocker un int", il stocke un emplacement. Cet emplacement peut exister ou peut être null 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.

C'est aussi pourquoi les pointeurs peuvent être délicats et frustrants. Ils introduisent indirects dans votre code.

1 in c Les pointeurs sont également largement interchangeables avec des tableaux afin que vous puissiez faire z [0] = 6 , bien que z à un seul int, tout index autre que 0 est invalide.


9 commentaires

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 lui-même n'est pas consommé. C'est toujours là. Vous pouvez faire int A = * z aussi facilement que possible * z + = 2 .


@Dylan No. * PTR = 6 stocke la valeur 6 de l'emplacement référencé par PTR . PTR Points toujours au même endroit.


Pensez à z en tant que "INTEGER INDIRECT", comme dans vous besoin de la désarférence pour en obtenir un. z + 6 fait le pointeur mathématique. * z + 6 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 est également un emplacement de mémoire, vous pouvez toujours faire int * zptr = & z , puis vous Vous avez un pointeur qui peut manipuler cette valeur, aucun malloc 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 , puis int y = x ? 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 eux.


@Dylan Ce n'est pas "Z = (adresse où 6 est lcancé)". Au lieu de cela, * z = 6 doit être interprété comme "stocker la valeur 6 à l'emplacement indiqué par Z". D'autre part, z = & x est "z = l'adresse de x" et * z = x est "stocker la valeur actuellement tenue par x à l'adresse actuelle tenue par z "



0
votes
int* add(int *x, int *y)
{
    int *z = NULL; 
    
    if(x && y)
    {
        z = malloc(sizeof(int));
        if(z)
        {
            *z = (*x) + (*y);
        }
    }

    return z;
}

0 commentaires

1
votes

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.

Vous êtes correct avec * z = 6 Cependant, vous vous trompez avec la façon dont cela se produit.

z est un pointeur et il pointe donc quelque part dans la mémoire. Plus tôt dans votre programme, avec int * z = malloc (tailleof (int)); Vous avez alloué un espace le z pointe vers.

alors quand vous avez fait * z = (* x) + (* y); Vous avez essentiellement le résultat de l'addition dans cet espace alloué.

z est toujours pointé vers cet espace (car c'est un pointeur). * z est appelé la déséroferience et a une signification d'atteindre directement pour la valeur que le pointeur pointe.

En d'autres termes: le 6 est stocké dans un endroit le z points sur et * z est un moyen de saisir cette valeur.


0 commentaires