über "int const *p" und "const int *p "
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int i1 = 0;
int i2 = 10;
const int *p = &i1;
int const *p2 = &i1;
const int const *p3 = &i1;
p = &i2;
p2 = &i2;
p3 = &i2;
cout << *p << endl
<< *p2 <<endl
<< *p3 <<endl;
return 0;
}
Den code kompiliert werden kann, sowohl mit VC6.0 und VC2010.
Aber ich habe Fragen als Schlag:
const int *p = &i1;
Es bedeutet, was die "p" - Punkte können nicht geändert werden,aber p kann nicht geändert werden,habe ich Recht?
so
p = &i2;
diese Linie kann erfüllt werden,ja?
Diese Zeile:
int const *p2 = &i1;
In meinem Kopf,das heißt p2 kann nicht geändert werden, während das, was p2 Punkte geändert werden kann, habe ich Recht?
Warum die
p2 = &i2;
kompiliert werden kann?
Über diese Zeile:
const const int *p3 = &i1;
p3 = &i2;
Oh,Gott... ich bin verrückt. Ich habe keine Ahnung, warum diese Zeile compiliert werden kann und kein Fehler...
Kann jede Stelle mir helfen?
Einen anderen code, das verwirrt mich hier:
class Coo2
{
public:
Coo2() : p(new int(0)) {}
~Coo2() {delete p;}
int const * getP() const
{
*p = 1;
return this->p;
}
private:
int* p;
};
warum dieser code kann kompiliert werden?
In
int const * getP() const
Habe ich den Wert ändern oder *p !
const
Sache gilt im übrigen für die Links, es sei denn, es gibt nichts auf der linken Seite, in dem Fall gilt es das Ding auf der rechten Seite. (Ja, das ist unnötig verwirrend und albern.)const
am Ende bedeutet, dass keine Veränderung vorgenommen werden, um das Objekt/die Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Hilfe der Zeiger kann man eigentlich zwei Dinge tun.
Nun, wenn du sagst, int const* ptr oder int const* ptr, es fällt unter die erste Kategorie. Es ist dasselbe wie -
In der Tat nicht in der Lage zu ändern, um eine andere Stelle, d.h., Zeiger auf eine Konstante Lage, sondern in der Lage sein, die Daten zu modifizieren, die Semantik sollte
int* const
. Da der Inhalt des Zeigers ist konstant, es muss initialisiert werden, während die Erklärung.Jedoch, gibt es eine Dritte Art. Konstanter Zeiger auf eine Konstante Lage, die sich weder auf einen anderen Speicherplatz noch das ändern der Daten, auf die es hinweist. ( D. H., const int* const )
Und jetzt die Beantwortung der Fragen, die ersten zwei können zusammengestellt werden, weil Sie nicht auf den ständigen Standorten. So, Sie können modifiziert werden, in späteren Phasen auch.
In der obigen snippet
p3
ist ein konstanter Zeiger auf eine Konstante Lage. Also, es kann nicht geändert werden.const
am Ende einer member-Funktion sagt, es wird sich nicht ändern den Zustand des Objekts. Wenn Sie sagen*p = 1;
ändern Sie nicht den Zustand des Objekts.p
noch Punkte auf die gleiche Speicherposition. Dies ist nicht erlaubt, das zu tun -Hoffe, jetzt verstehen Sie, warum das Programm kompiliert 🙂
Hier betrachten wir 4 Arten von Zeigern Erklärungen:
int * w;
Es heißt, w ist ein Zeiger auf einen Wert vom Typ integer. Können wir beide ändern den Zeiger und seine Inhalte. Wenn wir initialisieren w, während die Erklärung wie folgt:
int * w = &a;
Dann unten angegebenen Operationen sind sinnvoll:
w = &b;
(true)*w = 1;
(true)int * const x;
Es bedeutet, x ist ein konstanter Zeiger, die Punkte auf einen Wert vom Typ integer. Wenn wir initialisieren x während der Erklärung wie folgt:
int * const x = &a;
Dann können wir nicht tun:
x = &b;(wrong)
denn x ist ein konstanter Zeiger und kann nicht verändert werden.Es ist jedoch möglich, das zu tun:
*x = 1;(true)
, weil der Inhalt von x nicht konstant ist.int const * y;
//beide bedeuten das gleicheconst int * y;
Es bedeutet, dass y ein Zeiger verweist auf eine Konstante Ganzzahl. Wenn wir initialisieren y, während die Erklärung wie folgt:
int const * y = &a;
Dann ist es möglich zu tun:
y=&b;(true)
weil y eine nicht-Konstante Zeiger, die zeigen können, überall.Dennoch können wir nicht:
*y=1;(wrong)
weil die variable, die die y-Punkte, ist eine Konstante, variable und kann nicht geändert werden.int const * const z;
//beide bedeuten das gleicheconst int * const z;
Es bedeutet, dass z ein konstanter Zeiger, der zeigt auf eine Konstante Ganzzahl. Wenn wir initialisieren z während der Erklärung wie folgt:
int const * const z = &a;
Daher, nicht von unten angegebenen Operationen sind sinnvoll:
z = &b;(wrong)
*z = 1;(wrong)
int const * p;
undconst int * p
sind die gleichen. Es ist, wenn dieconst
kommt nach der*
dassdie Semantik des Ausdrucks ändern.
Ich weiß, es ist verrückt.
int const * getP() const
, gibt der Letzteconst
bedeutet, kann ich nicht ändern *p(was diep
verweist)?const
. Sie haben eine gut einführende Buch?const
bedeutet, ich kann es nicht ändernp
?Diese beiden erklären nicht-const-Zeiger auf const Daten.
Ist, mit
p
Sie können nicht ändern, die Daten die es verweist. Sie können jedoch ändern, der pointer selbst, zum Beispiel durch die Zuordnung alsp = &i2
die legal ist. Aber*p = 87987
ist illegal, da die Datenp
verweist const!--
Dieser erklärt const-Zeiger auf non-const-Daten. Das ist
p=&i2
ist illegal, aber*p = 98789
legal ist.--
Dieser erklärt const Zeiger auf const Daten. Das heißt, jetzt beide
p=&i2
und*p=87897
sind illegal.Die zwei sind genau die gleichen. Was zählt, ist die position der qualifier relativ zum asterisk (
*
):Nein, die
const
- Schlüsselwort vor der * bedeutet, dass die variable, die Sie zeigen wird ein "const" - variable, und nur Sie kann nicht geändert werden.Foo* const p = &bar;
const Foo* const p = &bar
Ist es völlig in Ordnung einen Zeiger von
const int* foo
zugewiesen werden, um einen Zeiger vonconst int* const bar
so, wie es ist in Ordnung zu haben eineint
's Wert zugewiesenconst int
. Denken Sie in der gleichen Weise.int const * ist das gleiche wie const int *
Lapidar; jede Kombination von read/write int & Zeiger;