2017-07-03 4 views
0

Ich habe das einfache Programm:Warum ist der Unterschied zwischen zwei Zeigern nicht gleich der Größe des Typs?

#include <iostream> 

using namespace std; 


int main() 
{ 
    int a = 5; 
    int b = 6; 
    int* p1 = &a; 
    int* p2 = &b; 
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl; 

    system("pause"); 
    return 0; 
} 

Es produziert die folgende Ausgabe:

00DBF9B8 00DBF9AC ,sizeof(int)=4 

aber, 00DBF9B8 - 00DBF9AC == С. Ich kann dieses Ergebnis nicht verstehen.

Wenn ich das Programm wie folgt ändern:

#include <iostream> 

using namespace std; 


int main() 
{ 
    static int a = 5; 
    static int b = 6; 
    int* p1 = &a; 
    int* p2 = &b; 
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl; 

    system("pause"); 
    return 0; 
} 

ich richtiges Ergebnis bekam:

00394000 00394004 ,sizeof(int)=4 
+7

Compiler müssen lokale Variablen nicht nacheinander einfügen –

+1

Sie können keine Zeiger subtrahieren, die nicht auf Elemente desselben Arrays oder auf das erste Byte hinter dem Array zeigen. –

+0

@SamiKuhmonnen Ich kann 10 Variablen erstellen. Alle Adressen unterscheiden sich durch "C". – Max

Antwort

5

Es gibt keine Garantie dafür, dass lokale Variablen (oder sogar statische Variablen) an aufeinanderfolgenden Speicheradressen gesetzt werden . Und tatsächlich wäre es ein undefiniertes Verhalten, wenn Sie zwei Zeigerwerte subtrahieren, die nicht in das gleiche Array zeigen.

Aber Sie könnten Zeiger arithmetics wie folgt verwenden:

int main() 
{ 
    int a; 
    int* p1 = &a; 
    int* p2 = p1+1; 
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl; 

    return 0; 
} 

Beachten Sie, dass ein einzelner Integralwert kann als ein Array der Größe 1 in Betracht gezogen werden, und dass p1+1 verweist daher auf „Eins nach dem letzten Element eines Array ", so dass die Operation p2 = p1+1 tatsächlich gültig ist (Dereferenzierung p2 wäre dann natürlich nicht gültig).

Verwandte Themen