L'affectation d'un pointeur sur un entier
Puis-je attribuer un pointeur vers une variable de type entier? Comme ce qui suit.
int *pointer;
int array1[25];
int addressOfArray;
pointer = &array1[0];
addressOfArray = pointer;
Est-il possible de faire comme ça?
avez-vous donné un essai?
Qu'attendez-vous une telle tâche à accomplir? Dites-nous ce réel problème que vous essayez de résoudre, et nous pouvons vous aider.
Sauf si vous avez une bonne raison pour cela, ne pas le faire. Et si vous le faites, ne pas utiliser un
Qu'attendez-vous une telle tâche à accomplir? Dites-nous ce réel problème que vous essayez de résoudre, et nous pouvons vous aider.
Sauf si vous avez une bonne raison pour cela, ne pas le faire. Et si vous le faites, ne pas utiliser un
int
, depuis un int
n'est pas nécessaire assez grand pour contenir un pointeur sur tous les systèmes (par exemple, la commune de LP64 et LLP64 modèles). Au lieu de cela, utiliser les intptr_t
.OriginalL'auteur user1293997 | 2012-05-07
Vous devez vous connecter pour publier un commentaire.
Pas sans un cast explicite, c'est à dire
Il y a aussi cette mise en garde:
De sorte que le résultat n'est pas garanti d'être une véritable valeur entière.
Réponse correcte, mais vous pouvez inclure le raison pourquoi le casting est nécessaire (la contrainte sur l'opérateur d'affectation mentionnée par @ouah).
De préférence, le type
uintptr_t
doit être utilisé au lieu deint
, car il est livré avec un ensemble beaucoup moins de mise en œuvre définies par le comportement.OriginalL'auteur John Bode
Non, il n'est pas valable pour affecter un pointeur vers un entier. C'est une violation de la contrainte de l'opérateur d'affectation (C99, 6.5.16.1p1). Un compilateur a le droit de refuser de traduire un programme avec un pointeur d'entier affectation.
OriginalL'auteur ouah
Il est fait fréquemment dans la programmation embarquée avec quelques mises en garde:
Mon BRAS bsp peu de magie pendant le démarrage: "taille = (unsigned)&__romend - (non signé)&__romstart;" j'ai vu ce genre de chose souvent nu-metal applications.
extern int8_t *__romend; extern int8_t *__romstart; size_t size=__romend-__romstart;
Si les pointeurs sont de type correct, vous avez juste à soustraire l'un de l'autre pour obtenir l'une réponse, comme @Throwback1986.Bien sûr, il n'y a plus d'une façon de defur d'un félin. Un autre exemple: mon GreenHills RTOS permet la transmission de message à l'aide de Tampons (Buffer ne signifie pas un simple tampon de mémoire). Pour l'installation d'un Tampon, quelque chose comme ceci est fait:
bufferControl.BufferType = DataBuffer | LastBuffer; bufferControl.TheAddress = (Address)&msgControl; bufferControl.Length = MAX_VAS_MESSAGE_SIZE; bufferControl.Transferred = 0;
DepuisAddress
est juste un typedef pourunsigned long int
, une situation similaire à l'OP de la question est présentée.Oui, c'est l'autre fois, vous avez besoin de le faire, mal écrit bibliothèques. Mais l'honnêteté (faites-moi confiance, je suis un ingénieur en logiciel ), vous n'avez pas besoin de le faire. Sauf si vous êtes à la mise en œuvre de print_pointer. Si jamais vous écrire un plâtre, puis posez-vous au moins 3 fois si vous le devez, alors demandez 3 autres personnes. Seulement alors considérer qu'il est peut-être la meilleure façon de le faire.
OriginalL'auteur Throwback1986
Nope.
Vous tentez d'attribuer un "pointeur sur int" la valeur d'un "int" à la variable. Vous obtiendrez un avertissement du compilateur pour vous. Vous pourriez faire:
Ce qui est connu comme une copie. Si vous n'êtes pas déjà familier avec le concept, je vous recommande fortement de le lire (Google "deep vs peu profonde de la copie").
OriginalL'auteur DevNull
Vous pourriez le faire comme ceci:
Qui permettrait de copier directement le sous-jacent d'octets et de supplanter l'opérateur de coulée, mais j'ai vraiment ne vous le recommande pas, sauf si vous savez certainement que
sizeof(int) == sizeof(int *)
sur votre système.OriginalL'auteur Richard J. Ross III