Si j'ai un pointeur sur un objet et que je veux obtenir un pointeur sur un objet qui dit 16 octets après le pointeur Comment puis-je ajouter le décalage 16 octets au pointeur? P>
En outre, les adresses de mémoire dans les systèmes 32bits ressemblent à ceci 0x00000000. Si je change d'adresse de 0x00000001 à 0x00000002, combien d'octets sont ignorés? P>
3 Réponses :
Les pointeurs comptent des octets, afin de pointer à l'octet suivant, vous devez modifier la valeur d'un pointeur par 1. L'arithmétique du pointeur, cependant, compte les objets pointés par le pointeur et incrémenter un pointeur augmente sa valeur par la taille de la taille de la taille de la taille. son type de pointage. Si vous souhaitez pointer sur des octets, utilisez un pointeur char code>, puisque Char code> a la taille 1 par définition et le pointeur arithmétique sur Char code> Pointants Vous pointez sur des octets: T * p = get_pointer();
char * cp = reinterpret_cast<char*>(p);
cp += 16;
Ohh, battez-moi de 40 secondes. :)
Je pense que ce que vous vouliez dire, c'est que les pointeurs comptent des objets; L'incrémentation d'un pointeur de 1 rend l'objet suivant de tout type qui pointe. Vous saviez clairement que, mais votre première phrase pourrait être interprétée comme indiquant que l'incrémentation d'un pointeur de tout type de type à l'octet suivant.
@Keith: Vous parlez de pointeur arithmétique i>. Je faisais référence au pointeur réel valeurs i>. L'arithmétique avance la valeur d'un pointeur tapé de la taille du type.
@Brian: type Punning est lorsque vous vous référez à une variable d'un type via un pointeur à un autre type, comme flotteur A; int b = * (int *) (& a); code>. C'est un comportement indéfini, à moins que l'un des types est un caractère. Pratiquement, cependant, le type punning «briserait des règles d'aliasing strictes», qui interfèrent avec les optimisations d'aliasing strictes.
Kerrek, oui, il parlait clairement de "pointeur arithmétique", mais vous avez également utilisé les mots exacts "un incrément de 1 déplace le pointeur sur [...]". Le moyen correct et sans ambiguïté du mot qui serait "une valeur de 1 plus élevé indique que le pointeur pointera [...]".
@KeithThompson: J'ai un peu revus. Ce n'était pas une bonne réponse pour commencer, j'espère que c'est un peu mieux maintenant.
Hmm. Je suis toujours (4 ans plus tard!) Pas fou de cette première phrase. La seule interprétation raisonnable de "Chang [Ing] une valeur du pointeur de 1" est d'ajouter 1 à celle-ci - ce qui lui permet de pointer vers le prochain objet objet i>, pas l'octet suivant. Char * Code> Les pointeurs comptent les octets (car les objets qu'ils indiquent sont 1 octet en taille).
@Keiththompson: Oui, c'est un gâchis. Les pointeurs n'ont aucune interprétation numérique intrinsèque. La cartographie à l'INT est indéterminée. Peut-être que je viens de supprimer le tout. Je pense qu'une explication via uintptr_t pourrait être articulée, mais je pense en fait que même la norme elle-même est confuse ici et que rien ne admet que les objets sont des matrices de caractères (il dit "séquence de caractères", qui n'est pas un terme normatif et ne le fait même pas Portail Pointeur Arithmétique).
Vous feriez cela:
char *arr = (char*)((void*) ptrToSomeObject); &arr[15]
(Char *) PtrtosomeObject code> devrait être suffisant.
Ouais, en pensant, oui. :)
Si j'ai un pointeur sur un objet et que je veux obtenir un pointeur sur un objet qui dit 16 octets après le pointeur Comment puis-je ajouter le décalage 16 octets au pointeur? P>
Casting via
Char * CODE> fonctionnera, mais cela peut être considéré comme une mauvaise pratique en fonction des détails de votre scénario: p>xxx pré> blockQuote> En outre, les adresses de mémoire dans les systèmes 32bits ressemblent à ceci 0x00000000. Si je change d'adresse de 0x00000001 à 0x00000002, combien d'octets sont ignorés? P> blockQuote>
La différence entre 2 et 1 est 1 - exactement un octet serait ignoré. P> blockquote>
Si l'objet est de 16 octets, il suffit d'incrémenter le pointeur ou d'indexer le pointeur (
psoméogjet [1] code>). Si 16 octets est arbitraire, alors La réponse de Kerrek vous a couvert .