2011-11-03 3 views
0

Que fait exactement cette ligne?compréhension: conversion de l'adresse int en tableau char

(char*) (&input)

Je sais qu'il convertit l'int (entrée) char array..or que je me trompe? et pourriez-vous me guider comment ça calcule?

mise à jour: Je pense que je comprends maintenant un peu, puis j'ai créé C++ code à partir de vos commentaires

#include <cstdlib> 
#include <iostream> 

using namespace std; 
int main(){ 
int input = 123456; 
int *p = &input; 

char *cp = (char*)p; 

for(int counter = 0;counter <sizeof(input); counter++){   
     cout << *(cp+counter) << endl; 
     } 


system("pause"); 
return 0; 
} 

mais je pense que mon code est erroné. parce qu'il ne montre que '@', gros 'r'? et quelque chose comme un signe de croix ...

+0

Comment est-ce que 'input' est déclaré? – Johnsyweb

+0

je l'ai déclaré comme entrée int; – jko

Répondre

1

Il s'agit simplement de lancer l'adresse input sous la forme d'un pointeur vers un char. Vous pouvez voir quelque chose de légèrement différent, comme:

unsigned char *bytes = (unsigned char*)&input; 

qui est utile pour la lecture les octets à l'adresse de input, puisque char est un octet en taille. Notez que char est signé et varie de -128 à 128 alors que unsigned char est (évidemment) non signé et plus approprié pour la lecture des octets car il est non signé et va de 0 à 255.

Vous pouvez alors lire des octets spécifiques comme:

first_byte = bytes[0]; 

Ou peut-être vous pouvez définir des octets spécifiques tels que:

bytes[0] = 0x7E; 
1

Si input est un nombre entier, il lit le bloc d'octets à cette adresse comme s'il s'agissait de caractères (vraisemblablement signés).

donc si l'entrée a la valeur 1.234.567.890 alors (en ignorant les détails comme l'ordre des octets) le char * rappelle les valeurs 0x49 0x96 0x02 0xD2

1

Il prend l'adresse de l'entier (un pointeur à int) et convertit le pointeur en pointeur-à-caractère. Vous pouvez ensuite utiliser ce pointeur pour lire les octets de l'entier un à la fois.

+0

oui j'ai obtenu 0x22ff44..i encore ne l'obtiens pas .. comment est-ce qu'il va lire les octets? pourriez-vous faire un exemple s'il vous plaît :) – jko

+0

int i = 12345; const char * pi = (const char *) & i; pour (int i = 0; i

3

Il n'a pas « convertir » quoi que ce soit. Vous pointez simplement sur le premier octet de l'entier.

Si votre int est de 32 bits (4 octets), et vous avez un pointeur vers elle ...

int myInt = 123456; 
int *ptr = &myInt; 

Ensuite, vous lancez ce pointeur vers char pointeur ...

char *cPtr = (char*)ptr; 

Vous avez maintenant un pointeur char pointant sur le premier octet de votre entier. Vous pouvez voir individuellement chaque octet via:

int i; 
for (i = 0; i < sizeof(int); i++) 
{ 
    printf("%d\n", *(cPtr+i)); 
} 

Notez que char est signé, de sorte que certains octets peut envelopper aux nombres négatifs. L'utilisation de unsigned char à la place changerait ce comportement. Si l'arithmétique du pointeur vous rend confus, vous pouvez remplacer *(cPtr+i) par cPtr[i] et obtenir la même sortie.

+0

Vous devez * vraiment * faire attention au code que j'ai posté ci-dessus. Il vous manque '*' dans plusieurs endroits très importants. Un '* 'dans une déclaration signifie que vous déclarez un pointeur. –

+1

Votre code dans votre édition convertit les octets en leurs équivalents de caractères imprimables (à partir de votre jeu de caractères par défaut, probablement UTF-8) parce que vous les envoyez à 'cout' et qu'ils sont de type' char * '. Vous devez réellement convertir l'octet en un int si vous l'envoyez au flux 'cout':' cout << (int) * (cp + compteur) << endl; ' –

+0

Comment l'obtenir? impression dans son octet équivalent – jko