2009-07-10 4 views
5

Ich versuche C++ über einige Web-Tutorials zu lernen. Ich habe keinen Compiler zur Verfügung, sonst würde ich das ausprobieren. Ich bin nicht sicher, was mit einem const Zeiger gemeint ist. Bedeutet das nur, dass es immer auf die gleiche Speicheradresse zeigt? Warum würdest du das jemals tun wollen? Wäre der folgende Code legal?Neu in C++. Frage über konstante Zeiger

... 
int * const aPointer = new int; 
... //do something with aPointer 
delete aPointer; 
... //do something else, including possibly more 'new' statements 
aPointer = new int; 
... 

Antwort

1

A const Zeiger bedeutet, dass man den Wert der Variablen ändern kann, die auf die gezeigt wird, aber sie kann sich nicht ändern, wenn der Zeiger gerichtet ist. Ich benutze sie nicht oft selbst, aber eine allgemeine Anwendung für const Zeiger ist in der Definition bestimmter Speichersegmente, die Sie ansprechen müssen. Weitere Informationen finden Sie unter this question.

Nebenbei sollten Sie versuchen, einen Compiler auf Ihrem Computer zu bekommen, wenn Sie können. Ich habe mir selbst oft gezeigt, dass menschliche Gehirne schlechte C++ - Compiler sind.

3

Sie können nicht lernen, ein Auto nur durch das Lesen von Büchern zu fahren.

Holen Sie sich einen C++ - Compiler, wenn Sie C++ lernen wollen. g ++ ist kostenlos, sowie Visual Studio 2008 Express Edition.

Wie für Ihre Frage ist ein const Zeiger eine Zone des Speichers, der nur bereit ist. Beispiel: Eine Klasse kann schreibgeschützten Zugriff auf einen internen Puffer bereitstellen.

Beachten Sie, dass Sie auch die const Zeiger haben, die auch const ist, aka

const char * const p 

In diesem Fall, auch der Wert des Zeigers nicht geändert werden kann.

+3

Dieser Beitrag ist verwirrend und unterscheidet nicht eindeutig zwischen dem Wert const und dem Zeiger const. –

+0

Es braucht mehr als nur einen Beitrag zu lesen, um den Begriff überhaupt zu verstehen. –

+1

Sie können die Verkehrsregeln nicht nur beim Fahren lernen. Sie werden nicht lernen, ohne Programmierung zu programmieren, und Sie werden nicht lernen, was legal und zuverlässig ist, ohne Bücher zu lesen. –

0

In Ihrem Code kann sich der Zeiger nicht bewegen, aber die Daten, auf die verwiesen wird, können sich ändern.

Es ist legal bis zum ersten löschen. Ein nachfolgendes neues würde nicht funktionieren, weil es eine Zuweisung zu einer Konstante ist.

Es ist relativ ungewöhnlich, dies zu sehen. Häufiger ist es zu sehen, wo die angezeigten Daten unveränderbar sind, aber der Zeiger kann sich bewegen.

int bar; 
int baz; 
const int * foo = &bar; 
*foo = 4; // illegal 
foo = &baz; // legal 

beide Zeiger und Wert const sein, ist gemeinsam mit Streichern

const wchar_t * const myString = L"String that will never change."; 
9

Konst Zeiger ein paar andere Dinge bedeuten könnte. Ich empfehle das C++ FAQ Lite in der Sache zu überprüfen.

können Sie haben:

const int* p; 
int* const p; 
const int* const p; 

Alle drei verschiedene Dinge bedeuten. Ja, es ist irgendwie verwirrend.

In Ihrem Fall haben Sie die zweite, was bedeutet, dass Sie einen konstanten Zeiger auf ein nicht konstantes Objekt haben. Das heißt, Sie können den Wert der Ganzzahl über den Zeiger ändern, aber Sie können nicht ändern, worauf der Zeiger zeigt. Also wäre der von Ihnen gepostete Code nicht legal.

18

Eine einfache Möglichkeit, sich zu erinnern, wie const mit Zeigern arbeitet, ist, sich immer auf das zu beziehen, was links davon liegt, es sei denn, es ist das linke Schlüsselwort, in diesem Fall gilt es rechts.

Beispiele:

Zeiger auf einen konstanten char: Der Zeiger kann geändert werden, um etwas anderes zu zeigen, aber die Zeichen es Punkte initally nicht Wert ändern können.

const char * p; 

Konstante Zeiger auf ein Zeichen: Der Zeiger kann nicht auf etwas hinweisen, sonst verändert werden, aber die Zeichen verweist er auf kann Wert ändern.

char *const p; 

Konstante Zeiger auf einen konstanten char: Der Zeiger kann nicht auf etwas hinweisen, sonst verändert werden, und die Zeichen verweist er auf nicht-Wert verändern.

const char *const p; 
+0

Zweites und drittes Beispiel haben eine falsch platzierte Konstante. Du meinst char * const p; –

+0

Danke für den Fang. –

1

Ihr Code ist nicht legal. Sie können aPointer nicht zuweisen (außer Kopierinitialisierung, die tatsächlich keine Zuordnung ist, obwohl es so aussieht), wenn aPointer wie const deklariert ist.

Aber normalerweise, wenn Leute "einen konstanten Zeiger" sagen, meinen sie const int * aPointer, nicht int * const aPointer, wie Sie in Ihrem Code haben. Das ganze Internet wird den Unterschied im Handumdrehen erklären. Soweit ich weiß, ist der Begriff "const pointer" nicht im Standard definiert, also können wir das tun, auch wenn es möglicherweise verwirrend ist. "Pointer-to-const" wäre eine eindeutige Beschreibung, und ein Pointer-to-const wird viel häufiger verwendet als ein pointer-which-is-iss-const.

Ein Zeiger-was-ist-sich-const wird verwendet, um auf etwas zu verweisen, wo Sie nicht wollen, dass der Zeiger auf ein anderes Ding an irgendeinem Punkt in seiner Lebensdauer verweist. Zum Beispiel ist this ein Zeiger-der-ist-sich-const, weil "dieses Objekt" das gleiche Objekt durch die Ausführung einer Elementfunktion bleibt. Die C++ - Sprache hat sich entschieden, Sie nicht entscheiden zu lassen, dass Sie this einen anderen Wert zuweisen möchten, damit er sich auf ein anderes Objekt bezieht. In C++ dienen Verweise oft auch diesem Zweck, da sie nicht "neu gesetzt" werden können, um den Verweis zu ändern.

0

Da Sie zu C++ neu sind, für die Antwort auf diese Frage und viele andere Fragen können Sie haben oder nicht wissen, Sie haben, besuchen Sie das C++ FAQ

0

Ich habe nicht einen Compiler zur Verfügung zu mir, sonst würde ich diese ausprobieren

Jeder hat einen C++ Compiler zur Verfügung: http://www.online-compiler.com

Es gibt viele andere, aber das s Eems zu arbeiten ...

2

G'day,

Um dies zu erinnern leicht können Sie den Trick verwenden, die Scott Meyers in seinem ausgezeichneten Buch "Effective C++" (sanitised Amazon link)

Sie eine Linie zeichnen beschreibt durch die Erklärung, wo das Sternchen befindet.

  • Wenn das Schlüsselwort const links von der Zeile angezeigt wird, können Sie den Wert des Elements, auf das Sie verweisen, nicht ändern.
  • Wenn das Schlüsselwort const rechts von der Zeile erscheint, können Sie den Zeiger nicht ändern, um auf einen anderen Ort zu zeigen.
  • Wenn const auf beiden Seiten angezeigt wird, können Sie den Zeiger nicht ändern, und Sie können den Wert dessen nicht ändern, auf den Sie zeigen.
  • BTW Dieses Buch ist ausgezeichnet, und zwar nicht für einen Anfänger, ist definitiv eine Möglichkeit, Ihre C++ Kenntnisse auf die nächste Stufe zu bringen! Sehr empfehlenswert.

    HTH

    prost,

    +0

    Als ich C unterrichtete, nannte ich das eine "Vertuschungsregel". –

    +0

    Diese Regeln (und dieses Buch) sind ausgezeichnet. –

    0

    Wie es die vielleicht häufigste const Zeiger darauf hingewiesen, bereits hat, ist

    const char* p; 
    

    Die Variable p ändern kann, aber die Daten p Punkte ist unmodifable .

    jedoch links von der Stern das Schlüsselwort const bewegt, ändert nichts an der Bedeutung der Deklaration:

    char const* p; 
    

    ich später bevorzugen, da es viel leichter merken wird, wo die const Schlüsselwörter zu platzieren, wenn deklarieren von const-Zeigern zu const-Zeigern:

    char const* const* p; 
    

    Auch hier kann sich die Variable p ändern und die angezeigten Daten sind nicht änderbar. Darüber hinaus werden die Daten als const pointer deklariert, was bedeutet, dass sie auf Daten zeigen, die nicht geändert werden können.

    Die üblichere Schreibweise für diese Art ist

    const char* const* p; 
    

    das Schlüsselwort const Platzierung unmittelbar links von dem Sternchen es (oder kaufmännische Und als Referenz) modifiziert macht es einfach, komplexen Typen Einbeziehung das const Schlüsselwort zu erstellen. Zum Beispiel kann ein Zeiger auf const Zeiger:

    char const** p; 
    

    und ein const Zeiger auf Zeiger:

    char* const* p; 
    

    Denken Sie daran, Zeiger Erklärungen von rechts nach links „lesen“, und nicht erklären, mehr als ein Zeiger in jeder Anweisung, um eine Menge Verwirrung zu vermeiden.