Question

Des conférences notes d'un cours à l'université, sur « appel par valeur »:

void fun(int *ip)

{

*ip =100;

}

appelé par

int n=2;  

int *np;

np = &n; 

fun(np);
     

changerait la valeur de n à 100.

Quand on dit « int * ip », qu'est-ce que nous voulons dire exactement? Un pointeur de type entier? Si oui, quand on appelle le plaisir () avec np comme argument, ne devrait pas être là une erreur que np a l'adresse n, est pas un entier?

Et puis, nous changeons la valeur de la propriété intellectuelle à 100, donc ne pas dire que n a maintenant la valeur qui se trouve dans la « fente de mémoire » avec l'adresse 100? Je suis sûr que je manque quelque chose. :)

Était-ce utile?

La solution

  

Un pointeur de type entier?

Non, un pointeur un entier.

  

lorsque l'on appelle le plaisir () avec np comme argument, ne devrait pas être là une erreur que np a l'adresse n, est pas un entier?

n est un entier donc il n'y a pas de problème. &n, np et ip tous ont le même type dans votre code. int*

  

Et puis, nous changeons la valeur de la propriété intellectuelle à 100

Non ... on change la valeur de *ip, et non de ip. Autrement dit, nous changeons la valeur ip Points à (ce qui est parfois aussi appelé pointée ).

Autres conseils

Oui, lorsque vous utilisez int * comme type de paramètre de fun vous dites qu'il accepte un pointeur vers un int. Depuis np est un pointeur vers un entier qui passe dans fun est ok.

np et ip pointent à l'adresse de n, de sorte que lorsque vous attribuez une valeur comme *ip = 42, elle attribue la valeur de 42 à l'emplacement de mémoire qui ip pointe vers -. Qui est n

Qu'est-ce que vous avez dans le code de l'échantillon est appelé passer par pointeur . Votre fonction a un paramètre de type pointeur en entier . Ainsi, la valeur passée à la fonction est l'adresse de la n variable. La fonction affecte à la variable 100 (à savoir un emplacement de mémoire) pointée par le paramètre de pointeur ip. Le * étoiles est le opérateur de déréférencement en C / C ++.

dans l'amusement (), vous ne changez pas la valeur de la propriété intellectuelle à 100, vous changez le à l'emplacement de la mémoire pointée par ip.

type* utilisé comme un type signifie "un pointeur sur ce type"

utilisation commune est int *var, mais j'aime écrire comme int* var que cela fait une meilleure distinction de dereferenceing un pointeur, à savoir *ptr.

si des moyens int* a, A est un pointeur sur un objet de type int, *a signifie que l'objet désigné par un moyen de &a et l'adresse de l'objet a.

penser à np comme de type int*. Gardez à l'esprit que, pour cet effet, l'astérisque et le int forment ensemble un type « pointeur vers int », et ne sont pas séparables.

ip est un pointeur, avec ip* vous accédez à la « fente de mémoire », il pointe vers. np est également un pointeur. En utilisant &n vous attribuer l'adresse de la fente de mémoire de n à np. Donc, lorsque vous appelez fun(), à l'intérieur fun() la seule fente de mémoire qui est accessible est l'un des n et donc à n 100 est attribué.

Une certaine confusion est possible ici parce que n et le nombre de magasin np - cependant, lors de la compilation, le compilateur utilisera les chiffres différemment; qui est, tout en

n++;

et

np++;

sont tous deux des opérations arithmétiques en fait, l'ensemble généré est différent. Il est important de se rappeler que, en fin de compte, toutes les données de l'ordinateur sont des nombres. Ils deviennent différents types de données simplement parce que nous les traiter différemment.

Plus précisément en ce qui concerne votre exemple,

*np = 100;

vous devez vous rappeler que les moyens de * déréférencer , et cette opération se produit avant la cession. Il peut être plus clair avec des parenthèses superflues:

(* (np) ) = 100;

ou dans un autre contexte:

int n = *np;

Maintenant, je dois dire, il me réchauffe le cœur quand vous dites,

  

nous modifier la valeur de la propriété intellectuelle à 100, donc ne pas dire que n a maintenant la valeur qui se trouve dans la « fente de mémoire » avec l'adresse 100?   comme il dément ce que je considère comme une compréhension importante. Cependant, je crois que je suis bon quand je dis, vous devez sortir de votre façon de faire ce genre de chose à des pointeurs:

static_cast<int>(np) = 100;

Ce serait faire ce que vous avez décrit, parce qu'il indique à l'ordinateur pour traiter le nombre qui est np comme un autre type de nombre; de la même manière que static_cast<char*>(np) traiterait les points de nombre np comme un caractère, plutôt que comme un nombre entier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top