PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pointer auf arrays "zurücksetzen"



nasontyphalt
26-08-2006, 14:01
Ahoi!

Wenn ich einen Pointer auf ein Array an eine Funktion übergebe und diesen dann in der Funktion inkrementiere, gibt es eine möglichkeit den dann wieder auf den übergebenen Wert zurückzusetzen oder muss ich den Wert in einer extra Variable speichern?

bischi
26-08-2006, 15:04
Mittels "call by value" wird der Pointer kopiert - das heisst, in der Funktion wird mit einer Kopie gearbeitet.

Bei "call by reference" wird mit dem Originalpointer gearbeitet.

Unterschied: Ein & in der Funktionsdeklaration.

Mfg Bischi

PS: Pointer inkrementieren? Meinst du da nicht etwa einen Iterator? Denn Arrays müssen afair nicht zwingend an einem Stück im Speicher liegen...

Vincent Vega
26-08-2006, 23:33
Wenn ich einen Pointer auf ein Array an eine Funktion übergebe und diesen dann in der Funktion inkrementiere, gibt es eine möglichkeit den dann wieder auf den übergebenen Wert zurückzusetzen oder muss ich den Wert in einer extra Variable speichern?

Ich verstehe Deine Frage so...



void foo(char *ptr) {
ptr++;
}

void bar(void) {
char a[2];
char *b = &a[0];

foo(b);
}


...du willst jetzt wissen, wie b aussieht, nachdem foo() aufgerufen wurde?

Nun, Du kannst Dir das ja einfach selbst klar machen. b enthält die Adresse des ersten Elements von a (hab's extra "ausführlich" geschrieben). ptr wird beim Eintritt in foo() mit dem Wert von b belegt sein. ptr und b sind aber zwei verschiedene Variablen, liegen in verschiedenen Bereichen vom Speicher. Wenn Du ptr veränderst, ändert sich an b nichts.

Dereferenzierst Du aber ptr, so greifst Du auf den selben Speicherbereich zu, den b referenziert. Beispiel:



void foo(char *ptr) {
*ptr = 0;
}

void bar(void) {
char a[] = "Hallo, Welt\n";
char *b = &a[0];

foo(b);
}


Nun gibt ein printf("%s", b) nichts mehr aus, nachdem foo() aufgerufen wurde. printf("%s", a) gibt auch nichts mehr aus, denn sowohl a, b als auch ptr referenzieren alle den selben Speicher.

nasontyphalt
27-08-2006, 11:42
void foo(char *ptr) {
ptr++;

/* Hier will ich ptr wieder auf den ursprünglich
an die Funktion übergebenen Wert zurücksetzen.
Bis jetzt habe ich das so gelöst, dass ich den Wert,
bevor ich ihn verändert habe in einem integer
gespeichert und bei bedarf wieder nach ptr kopiert habe.
Meine Frage ist nun, ob das so üblich ist. */

}

void bar(void) {
char a[2];
char *b = &a[0];

foo(b);
}

bischi
27-08-2006, 12:23
Ohne Garantie, hab schon lange nicht mehr C++ geproggt...



void foo(char &(*ptr)) {
ptr++;

/* Hier will ich ptr wieder auf den ursprünglich
an die Funktion übergebenen Wert zurücksetzen.
Bis jetzt habe ich das so gelöst, dass ich den Wert,
bevor ich ihn verändert habe in einem integer
gespeichert und bei bedarf wieder nach ptr kopiert habe.
Meine Frage ist nun, ob das so üblich ist. */

}

void bar(void) {
char a[2];
char *b = &a[0];

foo(b);
}


MfG Bischi

PS: Vielleicht musst du das ganze auch anders Klammern - irgendwo muss da auf jeden Fall ein & hin :D

peschmae
27-08-2006, 14:51
Das was du so willst geht nicht. Wie sollte es auch? Ein Pointer ist im Speicher (im Normalfall) nur eine Variable wo eine Adresse drinsteht. Die kann ja nicht wissen was sie früher mal war und schon gar nicht dass eine der Zahlen die dort mal drin war die Adresse eines Arrays war.

Dein Vorgehen ist schon richtig - eine Kopie des Pointers erstellen. Ist ja kein Problem. Nur bitte nicht in einem int speichern - es garantiert dir keiner dass int gleich viele Bytes gross ist wie ein Pointer (das mag auf deiner Plattform gerade stimmen, muss aber auf anderen überhaupt nicht so sein).

Also z.B. ptr einfach in Ruhe lassen:


void foo(char *ptr) {
char *working = ptr;
working++;
// blabla
}


dann könntest du den natürlich auch gleich als const übergeben an die Funktion wenn du möchtest ;)

MfG Peschmä