Frage zu pointer
-
Du musst mit einem Zeiger auf das Array arbeiten.
Versteh ich nicht so ganz, hab's aber trotzdem mal probiert. Ergebnis siehst du unten. Für mich bedeutet, das was ich da unten gemacht hab "mit einem Zeiger auf das Array".
So wie ich das jetzt gemacht hab, wird aber aus dem auf c übergegebenes "a" ein "b". Ist mir sogar mal klar, weil ich das übergegeben array dereferenziere und auf den Wert an der Stelle 0 eine 1 addiere, was ein b zur Folge hat. Wie ich aber den pointer des arrays verändere ist mir nach wie vor schleierhaft!
void push(char *stack, char c) { *array = c; *array = *array + 1; }
-
Du brauchst einen Zeiger auf einen Zeiger.
-
Geht das nicht auch ohne der Thematik "Zeiger auf Zeiger"?
-
bandchef schrieb:
Geht das nicht auch ohne der Thematik "Zeiger auf Zeiger"?
Was ist denn das was du erreichen willst? Das was du im ersten Beitrag beschreibst, kannst du auch mit einem static-Zähler erreichen
-
Was ist denn das was du erreichen willst?
Ich möchte einfach, dass mir der Stand eines Zeigeres um ein Element innerhalb einer Funktion weitergezhählt wird und genau dieser Stand auch in die main "übertragen" wird, damit ich diesen neuen und aktuellen Stand des Zeigers auf's array in weiteren Funktionsaufrufen nutzen kann.
Was ist ein static Zähler? Hab ich ebenfalls noch nie gehört...
-
Der Zeiger eines arrays zeigt quasi immer auf das erste element deines arrays...also die [0]
-
Dann gib doch den neuen Stand als Returnwert zurück.
Denke aber daran das du nicht den Startwert des arrays vergisst.
-
bandchef schrieb:
Was ist ein static Zähler? Hab ich ebenfalls noch nie gehört...
Das ist eine (lokale) statische Variable. Bei einer lokalen statischen Variable ist es so, dass sie am Ende der Funktion nicht wieder zerstört wird, sondern ihren Wert behält und du auf diesen wieder zugreifen kannst, sobald du die Funktion das nächste mal aufrufst. Ist z.B. so umsetzbar:
void push(char *stack, char c) { static int index = 0; //Wird nur beim ersten Funktionsaufruf mit 0 initialisiert *(stack + index) = c; ++index; }
Bei sowas muss man natürlich darauf achten, dass das char-array auch groß genug ist.
Edit:
So sieht der Spaß mit Zeiger auf Zeiger aus:void push(char **stack, char c) { **stack = c; ++(*stack); } int main(int argc, char **argv) { char *stack = calloc(6, sizeof(char)); char *stackStart = stack; if (!stack) return -1; push(&stack, 'H'); push(&stack, 'a'); push(&stack, 'l'); push(&stack, 'l'); push(&stack, 'o'); push(&stack, '\0'); puts(stackStart); free(stackStart); return 0; }
Sqwan schrieb:
Der Zeiger eines arrays zeigt quasi immer auf das erste element deines arrays...also die [0]
Nicht ganz. Den Namen eines Arrays kann man in gewissen/vielen Situationen wie einen Zeiger auf das erste Element eines Arrays behandeln.
-
Den Zähler static in push zu machen ist nicht so gut, da das pop den Zähler ja auch braucht.
Also Modul static.Wenn man eine globale Variable als static deklariert, ist sie nur in dem jeweiligen Modul sichtbar.
-
DirkB schrieb:
Den Zähler static in push zu machen ist nicht so gut, da das pop den Zähler ja auch braucht.
Also Modul static.Ack, hatte ich übersehen