Was wird gedruckt? C ++ Zeiger auf eine ganze Zahl

8

Also habe ich den folgenden (sehr einfachen) Code:

%Vor%

Also hier ist, was ich denke Ich mache (ich habe gelernt, dass ich in C ++ selten mache was ich denke, was ich tue):

  1. Erstellen eines Zeigers für eine ganze Zahl und Aufrufen von pInt
  2. statementA gibt die Adresse des Wertes '32'
  3. aus
  4. statementB gibt den ganzzahligen Wert aus, auf den mein Zeiger zeigt (was geschieht, weil ich den Zeiger dereferenziere und mir dadurch Zugriff auf das gebe, worauf er zeigt).
  5. statementC gibt die Adresse des Zeigers selbst aus (nicht die Adresse des Ganzzahlwerts '32').

Stimmt das alles?

    
MintGrowth 12.05.2011, 19:08
quelle

3 Antworten

10

Ihre zweite Aussage ist falsch. Sie reservieren ein neues int aus dem Heap. Die Kompilierzeitkonstante "32" hat keine Adresse und kann daher nicht übernommen werden. Sie erstellen ein int, dessen Wert 32 ist. Das ist nicht das Gleiche.

%Vor%

pInt1 und pInt2 sind nicht gleich.

Oh, eine letzte Sache - C ++ ist eine ziemlich stark typisierte Sprache, und es ist ziemlich unnötig, Variablennamen mit Typdaten zu versehen. Dies wird ungarische Notation genannt, ist in Microsoft C-Bibliotheken und Samples sehr üblich, aber in der Regel nicht notwendig.

    
Puppy 12.05.2011, 19:10
quelle
2
  • Gibt die Speicheradresse von pInt aus, die auf einen Speicherbereich (4 Bytes) zeigt, der den Wert 32 enthält:

std::cout<< pInt << std::endl; //statement A

  • Gibt den Inhalt dieser Speicheradresse aus:

std::cout<< *pInt << std::endl; //statement B, which should print 32

  • Gibt die Speicheradresse des Mauszeigers selbst aus:

std::cout << &pInt << std::endl; //statement C

    
karlphillip 12.05.2011 20:44
quelle
0

Statement B gibt den Wert des Objekts aus, auf das pInt zeigt. Es zeigt auf ein int mit dem Wert 32, also druckt es 32.

Die Anweisungen A und C sind nicht definiert. Das zu druckende Objekt ist in beiden Fällen ein Zeiger, der auf Maschinenebene eine Speicheradresse ist. Die meisten Compiler drucken eine Hexadezimalzahl, obwohl es keine Garantie dafür gibt. Der Wert hängt auch davon ab, wo die Objekte gespeichert sind. Zum Beispiel, g ++ in 32-Bit-Windows Vista auf meinem Computer druckt:

%Vor%

Borland druckt:

%Vor%

Visual C ++ druckt

%Vor%

Sie werden wahrscheinlich unterschiedliche Ergebnisse erhalten. Die erste Zahl ist die Adresse, die von new host () vom Heapspeicher zugewiesen und in pInt gespeichert wird. Es hat ein 4-Byte-Array zugewiesen, dort die Nummer 32 gespeichert und die Adresse in pInt gespeichert. Die zweite Zahl ist der gespeicherte Wert, interpretiert als int. Die dritte Zahl ist die Adresse (auf dem Stapel) von pInt.

    
Matt Mahoney 12.05.2011 20:39
quelle

Tags und Links