2016-06-11 7 views
-3

Wir wissen, Integer-Variable nehmen 4 (Byte) Speicheradresse. Ich frage mich nur, ob wir Integer-Variablen initialisieren und einen Zeiger darauf setzen. Ich kann den Wert davon vom Zeiger erhalten (die die Adresse der Variablen haben: 0x22fef8 in meinem Computer). Aber wie sieht es mit der Speicheradresse nach 0x22fef8 aus, die 0x22fef9, 0x22fefa, 0x22fefb? Was ist da drin? Werden wir den Wert der Variablen erhalten, wenn wir diese Adresse dereferenzieren? Wie man auf sie zugreift?Was ist innerhalb der übersprungenen Speicheradresse?

danke.

+1

bekommen Wenn eine ganze Zahl vier Bytes nimmt, dann enthalten diese vier Bytes, die die ganze Zahl. Was ist das Geheimnis? –

Antwort

5

Sie haben Recht: In einem 32-Bit-Computer nimmt eine ganze Zahl vier Bytes ein. In C, kann die durch den folgenden Code ausgedrückt werden:

int i = 0x12345678; 
int *p_i = &i;` 

Wenn p_i den Wert 0x22fef8 bekommt, dann würde p_i++0x22fefc worden, da es auf die nächste ganze Zahl verweisen würde. Wenn Sie sehen wollen, was in den Bytes ist, die i bilden, benötigen Sie einen anderen Zeiger verwenden:

typedef uint_8 byte; 
byte *p_b = (byte *)&i;` 

Das bedeutet, dass Sie den Zeiger-to-int ändern, dass &i darstellt und typisieren es ein Zeiger auf sein -zu-Byte. Es wird immer noch den Wert 0x22fef8 haben, da das ist, wo das erste Byte von i ist - aber jetzt, wenn Sie eine p_b++ machen, wird es zu 0x22fef9 wechseln. Wenn Sie den ursprünglichen Wert *p_b (das Byte, auf das es verweist) ausgeben, wird es nicht denselben Wert als i geben. Abhängig vom Computer wird entweder das erste Byte oder das letzte Byte ausgedruckt: 0x12 oder 0x78, oder zumindest die Dezimalversionen davon.

Dies liegt an der "Endianness" des Computers, die sich auf die Speicherung von Multi-Byte-Werten auswirkt. Little-Endian-Computer wie der x86 speichern den kleinsten Teil des Wertes zuerst - der 0x78 - während Power PC-Computer den größten Teil des Wertes zuerst speichern - 0x12.

+0

so innerhalb von 3 Bytes nach 0x22fef8 ist Stück der Variablen und hängt von der Spezifikation des Computers welcher Teil zuerst zu speichern? – Aorstab

+0

@Aorstab Das ist genau richtig. Wenn die 4-Byte-Ganzzahl _0x12345678_ bei _0x22ef8 _-_ 0x22efb_ gespeichert wurde, dann würde auf dem "x86" das "0x78" bei "0x22ef8" gespeichert werden, dann das "0x56" bei "0x22ef9" usw. Auf einem "PowerPC", dem '0x12' würde bei' 0x22ef8' gespeichert, dann '0x34' bei' 0x22ef9' usw. –

1

int Typen nehmen vier Bytes auf Ihrem System, so durch die int die sind alle besetzt. Alle sind außer dem ersten unzugänglich.

Es ist zu beachten, einige int s nehmen zwei Bytes auf anderen Systemen. Es ist nicht durch den Standard geregelt.

+1

Was meinst du mit "unzugänglich"? Natürlich können Sie auf diese Bytes zugreifen. – emlai

+0

nicht mit einem 'int *', was ich meinte, und war sowieso nicht wirklich konstruktiv. @ tuple_cat –

0

Wenn Sie die Werte in diesen Adressen sehen wollen, nur das tun, und Sie werden Werte von nächsten 10 Adressen

int main() 
{ 
    int a = 5; 
    int *p_i = &a; // The address of 'a' is stored in pointer 'p_i' 

    // Now you want to check the values in 10 further addresses 

    for (int i = 0; i < 10; i++) 
    { 
    int value = *p_i; // Here it is getting the address of pointer as integer value 
    cout << value << endl; 
    p_i++; 
    } 

    return 0; 
} 
Verwandte Themen