PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Initialisierung eines konstanten Zeiger klappt nicht (C++)


Nasenbaer
2003-07-24, 17:09:49
Hi,
ich arbeite mich gerade durch Stroustrups "C++ - Die Programmiersprache" durch und eine Übung klappt nicht ganz.

Es soll dabei ein konstanter Zeiger initialisiert werden:

const int Zahl = 11;
const int* i = &Zahl; // Zeiger auf eine Konstante
int *const x = i; // Konstanter Zeiger wird initialisiert
//Hier meckert VC++ .Net rum: 'Initialisierung' : 'const int *' kann nicht in 'int *const ' konvertiert werden

Ich habe es auch wie im Beispiel gezeigt mal mit char gemacht und das ging auch nicht. Weiß da jemand Rat?

Mfg Nasenbaer

ethrandil
2003-07-24, 17:26:55
nein ...
aber was ist der unterschied zwischen 'const int *' und 'int *const'???

versuchs doch mal mit

int *const x = (int *const)i;

Nasenbaer
2003-07-24, 17:27:48
Habs selber schon gefunden aber kapier das noch nicht ganz. :)
So muss es sein:


const int Zahl= 11;
const int* i= &Zahl; // Zeiger auf eine Konstante
int *const x= Zahl; // Konstanter Zeiger wird initialisiert

Warum muss ich einem Zeiger einen int-Wert zuweisen und keine Adresse. Also z.B. "int *const x = &Zahl;" ?

Mfg Nasenbaer

Nasenbaer
2003-07-24, 17:29:30
Original geschrieben von ethrandil
aber was ist der unterschied zwischen 'const int *' und 'int *const'???

const int* xy -> Zeiger auf eine konstante Int-Variable
int *const ab -> Konstanter Zeiger auf ein Int
:)

Mfg Nasenbaer

Nasenbaer
2003-07-24, 17:59:48
Original geschrieben von Nasenbaer
Habs selber schon gefunden aber kapier das noch nicht ganz. :)
So muss es sein:


const int Zahl= 11;
const int* i= &Zahl; // Zeiger auf eine Konstante
int *const x= Zahl; // Konstanter Zeiger wird initialisiert

Warum muss ich einem Zeiger einen int-Wert zuweisen und keine Adresse. Also z.B. "int *const x = &Zahl;" ?

Mfg Nasenbaer
Ne war doch nicht richtig. Aber jetzt hab ichs wirklich. :D
Das Beispiel im Buch sah so aus:

char str[] = "Hallo";
const char* i= str;
char *const x= str;

// Das klappt soweit

Mit int muss es aber so aussehen:

int Zahl = 34;
const int* i= &Zahl;
char *const x= &Zahl;

Aber warum? str liefert bei der Zuweisung doch eigentlich die Zeichenfolge >>Hallo<< und keine Adresse?! Oder wird hier implizit der Typ gewandelt?

Mfg Nasenbaer

ethrandil
2003-07-24, 18:04:49
doch, wenn ich richtig informiert bin, dann zeigt str auf das erste char im array!
mit dem [] operator kannst du dann auf einzelne zugreifen!

Nasenbaer
2003-07-24, 18:57:53
Original geschrieben von ethrandil
doch, wenn ich richtig informiert bin, dann zeigt str auf das erste char im array!
mit dem [] operator kannst du dann auf einzelne zugreifen!
Na dann dürfte das Problem ja geklärt sein. :)

Mfg Nasenbaer

Achill
2003-07-24, 19:39:14
also ich kenne es so...

int daten;
const int * eins;
int * const zwei = &daten;
const int * const drei = &daten;

Der Zeiger eins, ist ein Zeiger auf ein int Bereich, man kann die Adresse, auf die der Zeiger zeigt, ändern und auch die Daten an der Adresse auslesen. Man kann jedoch nicht die Daten an der Adresse ändern. Ähnlich wie bei get-Funktionen, wenn man einem Zeiger zurück gibt, jedoch immer verhindern will, das man diesen Zeiger ausversehen direkt nutzt und Daten zu ändert.

Der Zeiger zwei ist das selbe wie eine Referenz auf ein Datentyp. Man kann die Adresse nicht ändern - darum muss bei der Deklation auch gleich die Adresse mit übergeben werden! Man kann jedoch den Wert an der Adresse ändern.

Der Zeiger drei vereint beides, es ist quasie eine Referenz, die nur lesen darf. Man kann werder die Adresse noch die Daten ändern.

Hoffe es trifft es im großen und ganzen...

Achill
2003-07-24, 19:43:54
Original geschrieben von ethrandil
doch, wenn ich richtig informiert bin, dann zeigt str auf das erste char im array!
mit dem [] operator kannst du dann auf einzelne zugreifen!

Man muss nicht den [] operator nehmen um sich durch ein Array zu bewegen.
Man kann auch zu einem Zeiger einen Wert hinzu addieren und die summe dereferenzieren => *(zeiger+1) wäre das erste element vom array zeiger

es geht auch zeiger += x; wobei man hier die alte position vergisst - ich denke, man kann jedoch schreib/leseoperationen beschleunigen, wenn man oft von einer bestimmten position im Array liest...

Nasenbaer
2003-07-24, 20:20:11
Original geschrieben von Achill
also ich kenne es so...

int daten;
const int * eins;
int * const zwei = &daten;
const int * const drei = &daten;

Der Zeiger eins, ist ein Zeiger auf ein int Bereich, man kann die Adresse, auf die der Zeiger zeigt, ändern und auch die Daten an der Adresse auslesen. Man kann jedoch nicht die Daten an der Adresse ändern. Ähnlich wie bei get-Funktionen, wenn man einem Zeiger zurück gibt, jedoch immer verhindern will, das man diesen Zeiger ausversehen direkt nutzt und Daten zu ändert.

Der Zeiger zwei ist das selbe wie eine Referenz auf ein Datentyp. Man kann die Adresse nicht ändern - darum muss bei der Deklation auch gleich die Adresse mit übergeben werden! Man kann jedoch den Wert an der Adresse ändern.

Der Zeiger drei vereint beides, es ist quasie eine Referenz, die nur lesen darf. Man kann werder die Adresse noch die Daten ändern.

Hoffe es trifft es im großen und ganzen...
Jo so stand das auch alles im Buch drin. Das Problem war nur die Sache mit dem Adress-Operator. Bei int muss er benutzt werden bei char[] nicht. Das wusste ich nicht.

Mfg Nasenbaer

liquid
2003-07-25, 10:32:35
Mit Zeigern hatte ich letztens auch so meine Probleme. Aber nachdem ich ein paar Veränderungen am Code vorgenommen hatte, ließ sich das Projekt auch wieder compilen.

const basic_vector** basic_plane::splitMany(
const basic_vector* const _vecs, ulong& _cnt) const
{
const basic_vector** const _ptr_array = new basic_vector const*[_cnt];

ulong _pos = 0; // vectors on positive side
ulong _neg_idx = _cnt - 1;

for (ulong i = 0; i < _cnt; ++i)
{
if (classify(_vecs[i]))
_ptr_array[_pos++] = &_vecs[i]; // point on positive side
else
_ptr_array[_neg_idx--] = &_vecs[i]; // point on negative side
}

_cnt = _pos;
return _ptr_array;
}

Das Problem war das Zeiger-Array, da hab ich mit dem const rumprobiert bis es dann ging.

cya
liquid

GloomY
2003-07-25, 11:16:08
Original geschrieben von Nasenbaer
Jo so stand das auch alles im Buch drin. Das Problem war nur die Sache mit dem Adress-Operator. Bei int muss er benutzt werden bei char[] nicht. Das wusste ich nicht.

Mfg Nasenbaer Das liegt daran, dass nach

char str[] = "Hallo";"str" ein Array ist. Der Name des Arrays ist aber immer ein Zeiger auf das aller erste Element ("*str" ist das gleiche wie "str[0]"; "*(str+1) das gleiche wie "str[1]" usw.). Da es bei deiner Zuweisung zwei Zeiger sind musst/darfst du natürlich keinen Adressoperator "&" verwenden, .

Nasenbaer
2003-07-25, 11:42:30
Original geschrieben von GloomY
Da es bei deiner Zuweisung zwei Zeiger sind musst/darfst du natürlich keinen Adressoperator "&" verwenden, .
Jo davon bin ich dann auch ausgegangen. Wollte es natürlich mit std:cout überprüfen. Allerdings wird dabei natürlich der Inhalt des Arrays ausgegeben. Daran hatte ich nicht gedacht. :)

Mfg Nasenbaer