Frage zu Pointer-Arithmetik
-
Habe eine Frage zu folgendem Programm.
Vorab kurz meine Interpretation zu Pointern. Ein Pointer ist ein Zeiger und zeigt auf eine Adresse, welche durch den * den Inhalt lesen kann dieser Adresse. Das ist doch so richtig?
An der Stelle 8. Stelle und folgend verstehe ich aber nicht wie der Zeiger auf die Adresse (bei mir) ...35 zeigt und gleichzeitig auf einen anderen Buchstaben, als er normalerweise zeigen müssete. Die Stelle 0X...35 würde doch auf f zeigen und nicht e.Müsste der Zeiger nicht auf den dazugehörigen Buchstaben zeigen, auf welcher auch die Adresse zeigt?
int main()
{
char txt[] = "abcdefghij";
int i = 0;
char *zeiger;
zeiger - Typ charprintf("Start-Adresse (&txt[0]): \t0x%X\n", &txt[0]);
zeiger = txt;
printf("Start-Adresse (txt): \t\t0x%X\n", txt);zeiger = &txt[1];
printf("\n1. zeiger:\t %X ", zeiger); getch();
printf("\n2. *zeiger:\t %c ", *zeiger); getch();
printf("\n3. ++zeiger:\t 0x%X ", ++zeiger); getch();
printf("\n4. *++zeiger:\t %c ", *++zeiger); getch(); //d Priorität =, re -> li
printf("\n5. zeiger:\t %#X ", zeiger); getch();
printf("\n6. *zeiger++:\t %c %X ", *zeiger++,zeiger); getch();
printf("\n7. *(zeiger++):\t %c %X ", *zeiger++, zeiger); getch();
printf("\n8. --(*zeiger):\t %X %c ",zeiger, --(*zeiger)); getch();
printf("\n9. *zeiger:\t %X %c ", zeiger, *zeiger); getch();
printf("\n10. *(zeiger-3): %X %c ",zeiger, *(zeiger-3)); getch();
printf("\n11. *zeiger): %X %c ",zeiger, *zeiger); getch();
printf("\n12. ++zeiger: %X %c ",++zeiger, *zeiger); getch();
printf("\n13. *++zeiger: %X %c ",zeiger, *++zeiger); getch();
printf("\n14. *++zeiger: %X %c ",zeiger, *++zeiger); getch();getch();
return 1;
}Programm kann problemlos ausgeführt werden.
DANKE
-
bin mir nicht sicher, aber ich glaube es liegt an der Reihenfolge:
printf("\n8. --(*zeiger):\t %X %c ",zeiger, --(*zeiger)); getch();
Du lässt dir zuerst die Adresse ausgeben, dekrementierst dann und DANN erst wird das Zeichen ausgegeben, also andere Stelle als du dir anzeigen lässt.
-
Ich sage mal mit den Operatorprioritäten ist das soweit klar, aber wie kann der Pointer auf eine Adresse zeigen (bei den folgenden), welche aber nicht den Buchstaben zugeordnet ist? Normalweise speicher doch der Pointer die Adresse der Variable, auf welche er zeigt. Und mit * greift er auf den Inhalt der Variable zu.
Wie geht es dann, dass Adresse auf etwas anderes zeigt, als der Inhalt?
-
printf("\n3. ++zeiger:\t 0x%X ", ++zeiger); getch();
printf("\n4. *++zeiger:\t %c ", *++zeiger); getch()du incrementierst den zeiger 2x wenn du ++zeiger machst, musst du ihn nicht mehr beim inhalt aufrufen inkrementieren.
-
Diese Zeilen sind mir soweit klar.
Für das ganze habe ich mir mal eine Tabelle aufgestelt:
Var. Adresse
a --> ...30
b --> ...31
c --> ...32
d --> ...33
e --> ...34
f --> ...35
g --> ...36
...Bis zu 6 passt die Zuordnung Pointer zeigt auf Adresse und liesst Inhalt (nach der Tabelle).
Aber ab 7 und folgend zeigt der Pointer auf die Adresse ...35 und Inhalt e?
Das verstehe ich nicht. Oder kann man das nicht so zuordnen?
-
versuch doch mal
char *txt = "abcdefghij"; statt char txt[] = "abcdefghij";
dann sollte sich dein problem relativ schnell lösen lassen, denn du veränderst nicht den zeiger sondern den speicherbereich auf den dein zeiger zeigt
"--(*zeiger)" bewirkt das in txt[5] statt 'f' 'e' steht denke das bringt dir dann auch die folge fehler
lg lolo
-
OK. Aber warum ist das dann so bei der jetzigen Deklaration? Muss sich ja auch erklären lassen
-
OK. Aber warum ist das dann so bei der jetzigen Deklaration? Muss sich ja auch erklären lassen
also das check ich nicht
meinst du wieso sich der speicher ändert?
//dein zeiger -- und dann ab zur speicher stelle *--asd vs //du gehts dahin wo dein zeiger hin zeigt und dann -- --*asd == --(*asd)
oder auf was willst du hinaus?
-
Der Zeiger ist ja auf ein Array gerichtet. Und der zeiger kann ja nur das wiedergeben, wo die Adresse darauf zeigt. Und da habe ich diese Tabelle aufgestellt zu welchem Buchstaben, welche Adresse gehört.
Und ab 9 ist die Adresse wo der Zeiger hinzeigt verschieden von dem dazugehörigen Buchstaben aus dem Array. Und das verstehe ich nicht?
Wenn der Poiter im Array eine Position weiterrückt, dann ändert sich doch der Buchstabe und die Adresse +1, so wie es bis 6 ist.
-
Seppe123 schrieb:
...
printf("\n6. *zeiger++:\t %c %X ", *zeiger++,zeiger); getch();
printf("\n7. *(zeiger++):\t %c %X ", *zeiger++, zeiger); getch();
printf("\n8. --(*zeiger):\t %X %c ",zeiger, --(*zeiger)); getch();
printf("\n9. *zeiger:\t %X %c ", zeiger, *zeiger); getch();
printf("\n10. *(zeiger-3): %X %c ",zeiger, *(zeiger-3)); getch();
printf("\n11. *zeiger): %X %c ",zeiger, *zeiger); getch();
printf("\n12. ++zeiger: %X %c ",++zeiger, *zeiger); getch();
printf("\n13. *++zeiger: %X %c ",zeiger, *++zeiger); getch();
printf("\n14. *++zeiger: %X %c ",zeiger, *++zeiger); getch();
...^^ die ausgaben könnten dich verwirren. 'printf' muss seine argumente nicht zwingend von links nach rechts durchnudeln. probier mal folgendes:
int a = 0; printf ("%d %d %d\n", a++, a++, a++);
gibt bei mir
2 1 0
aus. erwarten würde man wohl:0 1 2
-
--*asd
verändert dein array da kannst deine zeiger so oft rum schieben wie du willst.
--*asd
rechnet nicht temorär den zeiger -1 sondern rechnet 'f'-1 was dann 'e' ergibt und das steht dann in deinem array? kpl. wie man das erklären soll, besorg dir nen debugger und schau es dir an :p
-
Stimmt
Und warum ist das so mit printf?
Debugger ist eine gute Idee
-
Seppe123 schrieb:
Stimmt Und warum ist das so mit printf?
nicht nur mit printf, sonst auch. http://books.google.com/books?id=y2hNvU6b2-sC&pg=PA117&lpg=PA117&dq=sequenzpunkt&source=bl&ots=pnSOd2ShIC&sig=4Kg-h6PlXpPgbYPLhvZeX3MGurg&hl=en&ei=TZdZS7uuI8vesAa1punRAw&sa=X&oi=book_result&ct=result&resnum=2&ved=0CA8Q6AEwAQ
zerleg's in mehrere 'printfs', dann funzt es.