Si vous passez une valeur ou un pointeur sur la pile la mémoire nécessaire pour maintenir cette valeur est allouée sur la pile ...
La façon dont la pile fonctionne, vous pouvez garder « allocation » plus de mémoire, mais il doit être "libéré" dans l'ordre inverse.
Alors:
void f(int *ptr, int v)
{
// Do something
}
Lorsque vous appelez f() la valeur de ptr et v sont « poussés » sur la pile, qui est une mémoire suffisante est magique créée pour maintenir ces valeurs. Lorsque la fonction retourne la pile est ajustée dans l'autre sens, dans un sens, ils sont "sautés" de la pile.
Cette pression et ce déclenchement n'ont aucun effet sur le pointeur ou la valeur d'origine. Alors:
ptr++;
Est-ce pas effet la valeur du pointeur détenu par la fonction appelante.
Si vous déréférencez, * ptr, le pointeur vous donne accès aux mêmes données visibles de l'extérieur de la fonction. Si vous libérez() le pointeur, cela affecte ce qui est vu de l'extérieur de la fonction. Ainsi, lorsque vous passez un pointeur, il n'y a aucune copie faite des données d'origine vers lesquelles le pointeur pointe, mais il y a une copie faite du pointeur réel. Le pointeur est passé par valeur.
Il existe toujours un constructeur de copie implicite, même pour vos propres types. Si vous n'avez pas besoin d'une sémantique particulière, ils seront gérés automatiquement de la même manière que les "chaînes". –
@Roberto: Je parle de types qui allouent de la mémoire. J'aurais dû dire "ne se produira pas nécessairement" automatiquement :) – sje397