7 votes

Je me demande ce que rapporte vraiment le &a ?

Supposons que

Premier cas

 int a;
 int *p= &a ; it works no error

Deuxième cas

 long int a;
 long int b;
 b = & a; it wont work 

La plupart d'entre nous disent que b est une variable et non un pointeur. Mais voyez ce qui suit.

La question est donc de savoir si le &a retourne l'adresse qui est un entier non signé alors pourquoi ne pouvons-nous pas l'assigner à une variable normale ? Mais pourquoi seulement aux pointeurs ? Voir ci-dessous

b = (unsigned int) &a ; it works after typecasting though its not practicable.

Si l'adresse est au format entier, pourquoi les entiers non signés ou longs ne la sauvegardent-ils pas ? Je me disais qu'il devait y avoir un secret caché derrière tout cela. Quelqu'un pourrait-il le révéler ? Ce que je pense, c'est que les pointeurs doivent faire quelque chose à l'intérieur, mais je me demande ce que ça peut être et pourquoi une variable normale ne peut pas l'être.

Merci pour toutes vos réponses, mais la vraie question est de savoir ce qu'est vraiment la &a retours ? Valeur entière ou non ? Si c'est un nombre entier, pourquoi une variable ne peut-elle pas le contenir ? long int a =65535 \valid pourquoi pas int a= &b si la valeur de l'adresse b est 65535

Je ne m'inquiète pas de l'utiliser comme pointeur, s'il vous plaît, la question est de simplement sauvegarder la valeur. Pas le déférencement de l'adresse. Les gens disent 32 ou 64 bits, je ne suis pas inquiet à ce sujet. Pourquoi ne peut-il pas sauvegarder l'adresse si l'adresse est un nombre entier ?

Je veux dire pourquoi on ne peut pas assigner la valeur, je ne dis pas qu'il faut assigner les propriétés des pointeurs à la variable mais juste assigner la valeur, c'est tout.

a=65535
b = a \\ works it assigns b - 65535
&a=65535
b = & a   \\ doesn't work, if address is a some integer value,why we can't store it in a variable?

Prenons l'exemple de 16 bits. La taille normale d'un pointeur (l'adresse) est de 2 octets et celle d'une variable est de 2 octets. Pourquoi ne pouvons-nous pas stocker l'adresse dans une autre variable si l'adresse est une valeur entière ? C'est ma question. Je trouve beaucoup de réponses comme ++ qui incrémente de 4 au pointeur et la valeur 1 à la variable.

  b = & a ; address of a is 4000
  ++b ; becomes 4001 thats it,thats not a problem

22voto

Dean Harding Points 40164

Entiers, pairs long int ne sont pas toujours de la même taille qu'un pointeur. Parfois, ils le seront (par exemple, la plupart des architectures 32 bits ont une taille de sizeof(int) == sizeof(void *) ), parfois ils seront différents (par exemple, certaines architectures 64 bits ont des sizeof(long) == sizeof(void *) mais certains ne le font pas - Visual C++ sur Windows étant un exemple parfait de compilateur où sizeof(long) != sizeof(void *) ).

Il y a aussi le fait que void * n'est tout simplement pas le même type comme long int .

Imaginez une classe Foo et une classe Bar défini comme suit :

class Foo {
   public: int a;
};

class Bar {
   public: int b;
};

C'est comme demander pourquoi vous ne pouvez pas assigner une instance de la classe Foo à une variable de type Bar -- ce n'est pas la même chose, même si dans ce cas les deux Foo y Bar ont la même configuration binaire sous-jacente.

7voto

Ingo Points 21438

renvoie l'adresse qui est un entier non signé

Non, ce n'est pas le cas. Un pointeur (adresse) est un pointeur. Point final.

6voto

Steve-o Points 9043

Vous pouvez et c'était très commun, c'est un problème de portabilité pertinent maintenant cependant car il ne peut pas être utilisé sur les plates-formes x64 avec un pointeur 64 bits et un entier 32 bits.

Cela peut provenir de l'utilisation de l'assembleur où un registre peut être facilement interprété à la fois comme un entier et un pointeur.

Ce n'est pas très judicieux dans l'usage moderne car cela peut facilement conduire à des erreurs et à la confusion. Les améliorations de la sécurité des types dans la conception du compilateur interdisent une telle utilisation, mais C99 réintroduit un support similaire avec uintptr_t y intptr_t qui sont des "types entiers capables de contenir des pointeurs d'objets".

Pour paraphraser votre question :

Pourquoi ne pouvons-nous pas assigner [un pointeur] à une variable [un nombre entier] ?

La réponse est : parce que ce n'est pas de l'assembleur, le C et le C++ sont fortement typé les langues.

3voto

MSalters Points 74024

Ce n'est pas spécifique au C ou au C++. C'est la même chose dans tous les langages fortement typés. Dans une certaine mesure, c'est même vrai en anglais. On peut dire que "la couleur du livre est bleue", mais pas "la couleur du livre est en bois". A type restreint les possibilités valeurs qu'une variable peut avoir.

Une variable int* ne peut contenir que des valeurs qui sont des adresses d'int, et une variable de type long int ne peut contenir que des valeurs comprises entre LONG_MIN y LONG_MAX inclusif. C'est juste deux ensembles de valeurs complètement distincts.

Le C et le C++ ne sont pas absolus. Le typage vous permettra de contourner certaines restrictions. Par exemple (int) 3.5 indique au compilateur que vous voulez convertir la valeur non entière 3,5 en une valeur entière approximativement similaire. Cela fonctionne mieux si les deux types sont plus similaires. D'autres langages ne disposent pas d'un tel typecasting ; dans ce cas, vous devrez peut-être appeler une fonction à la place. Par exemple ROUND(3.5, INT)

2voto

Raku Points 479

Niko, à mon avis, l'intérêt des langages typés est que vous ne pouvez pas simplement assigner une chose à une autre, même si elles ne sont qu'un tas de bits au niveau le plus bas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X