2009-05-22 18 views
8

Kann einen Zeiger auf einen Wert bei der Deklaration zuweisen? Etwas wie folgt aus:Initialisieren von Zeigern in C++

int * p = &(1000) 
+4

Versuchen Sie, es auf eine absolute Adresse zu setzen, d. H. Auf ein eingebettetes System?Es macht einen großen Unterschied für die Antwort. –

+1

In der Tat ist es schwer zu erraten, was Sie suchen ... Ich denke, Sie sind neu in Zeigern und verwirren die verbalen Begriffe, nun ... Jeder muss irgendwo anfangen. :-) –

Antwort

22

Ja, können Sie Zeiger auf einen Wert nach der Deklaration initialisieren, jedoch können Sie nicht tun:

int *p = &(1000); 

& die Adresse Operator ist und Sie können nicht Wenden Sie das auf eine Konstante an (obwohl, wenn Sie könnten, wäre das interessant). Versuchen Sie es mit einer anderen Variable:

int foo = 1000; 
int *p = &foo; 

oder Typ-Casting:

int *p = (int *)(1000); // or reinterpret_cast<>/static_cast<>/etc 
+2

Sind Stringkonstanten ein Sonderfall? Obwohl dies ein "const char *" sein müsste ... – dmckee

+3

Ja, String-Literale sind insofern besonders, als sie lvalue-Ausdrücke sind und sich auf ein Array-Objekt beziehen (kein Zeiger). Also kannst du 'char const (* p) [3] = &"01";' Nicht weniger interessant ist das Initialisieren eines char const * wie folgt: 'char const * p = & "hallo da" [0];' –

+0

es funktioniert nicht, ich habe versucht, aber es zeigt einige Müllart Wert. ** 'int * p = (int *) 100;' **. dann ist die Ausgabe etwas wie ** '000003E8' ** – Ravi

2

Um. Ich glaube nicht, dass Sie eine nicht konstante Adresse einer solchen Konstante nehmen können.

aber dies funktioniert:

int x = 3; 
int *px = &x; 
cout << *px; // prints 3 

oder dies:

const int x = 3; 
const int *px = &x; 
const int *pfoo = reinterpret_cast<const int*>(47); 
4

Was:

// Creates a pointer p to an integer initialized with value 1000. 
int * p = new int(1000); 

getestet und funktioniert. ;-)

+3

Aber vergessen Sie nicht zu löschen! – GManNickG

7

In der Frage sind mir zwei Dinge nicht klar. Möchten Sie den Zeiger auf einen bestimmten Wert (z. B. Adresse) festlegen oder möchten Sie den Zeiger auf eine bestimmte Variable zeigen?

Im letzteren Fall können Sie einfach den Adressoperator verwenden. Der Wert des Zeigers wird dann auf die Adresse von some_int_variable gesetzt.

int *p = &some_int_variable; 
*p = 10; // same as some_int_variable = 10; 

Hinweis: Was folgt, ist böser Wechsel des Wertes des Zeigers manuell. Wenn Sie nicht wissen, ob Sie das tun wollen, wollen Sie es nicht tun.

Im ersteren Fall (d Einstellung bis zu einem gewissen spezifischen, gegebenen Adresse) können Sie nicht nur

int *p = 1000; 

Da der Compiler die int und interpretieren sie als eine Adresse nicht nehmen. Sie müssen den Compiler sagen, dass explizit tun sollten:

int *p = reinterpret_cast<int*>(1000); 

Nun wird der Zeiger eine ganze Zahl Referenz (hoffentlich) bei der Adresse 1000. Beachten Sie, dass das Ergebnis Implementierung definiert. Aber das ist die Semantik und das ist die Art, wie Sie dem Compiler davon erzählen.

-Update: Der Ausschuß fixierte das seltsame Verhalten von reinterpret_cast<T*>(0), die von einer Note und für die vorgeschlagen wurde ich zur Verfügung gestellt, bevor eine Abhilfe. See here.