Pointer erhöhen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Pointer erhöhen

    moin,

    kann mir einer sagen, wieso folgender code nicht funktioniert?

    #include <stdio.h>

    int main(void) {
    char charArray[10];
    charArray++;

    return 0;
    }


    als fehler kommt:
    arrpr.c:5: error: lvalue required as increment operand


    woran liegt das?
  • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]Also ich bin jetzt nciht der C++ Kenner, lerne selber ab und zu mal oder so.
    Bin atm mal an ner Gamengine gewesen, wollte die benutzen für bissl zu testen.

    Naja aber dein fehler, ich denke du kannst ein Array nicht einfach so inkrementieren, du willst ja ne einzelnen Variable inkrementieren.
    Also musste den Index angeben den du erhöhen willst, schon sollte es klappen[/SIZE][/COLOR][/FONT]
  • internetfreak;91385 schrieb:

    [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]Also ich bin jetzt nciht der C++ Kenner, lerne selber ab und zu mal oder so.
    Bin atm mal an ner Gamengine gewesen, wollte die benutzen für bissl zu testen.

    Naja aber dein fehler, ich denke du kannst ein Array nicht einfach so inkrementieren, du willst ja ne einzelnen Variable inkrementieren.
    Also musste den Index angeben den du erhöhen willst, schon sollte es klappen[/SIZE][/COLOR][/FONT]

    Wieso sollte ich einen Pointer nicht inkrementieren können? oO
  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]Ich sehe halt auf den ersten Blick nur ein Array
    char Variable //deklaration einer variable
    char Variable[10] //Array mit 10 Plätzen für Dinge vom Typ Char schaffen
    So sehe ich das halt eben, werde mich schlau machen und dann sehen wir weiter
    (habe von c++ noch nich die beste ahnung, auch ich kann mich irren)
    Bin aber am lernen und Pointer kommen halt mal irgendwann

    Edit:
    ´Schwierigkeiten bereitet oft die Deklaration von Pointern auf ein Array bzw. eines Arrays aus Pointern. Hier ist die Rangfolge der Operatoren zu beachten. Der Indexoperator [] hat eine höhere Präferenz als der Dereferenzierungsoperator *.

    int* p; // Pointer aus integer
    int a[3]; // Array aus integer
    int* a[3]; // Array aus integer-Pointern
    int (*a)[3]; // Pointer auf Array aus integer
    int* (a[3]); // Array aus integer-Pointern

    oder völlig abgefahren

    int* (*a)[3] // Pointer auf Array aus integer-Pointern
    int* *a[3]; // entspricht int** a[3]: Array von Zeigern auf Integerzeiger

    Quelle: mathematik.uni-marburg.de/~cpp/pointer/index.html

    Da liegt der Grund deines fehlers, ich wusste es doch, dass du versuchst ein Array zu inkrementieren, was ohne Indexangabe nich klappt.
    Fehlerbehebung: das Skript um eines der o.g Dinge zu erweitern. ;D
    Is jetzt nix gegen dich, aber ich wusste doch da is was faul[/SIZE][/COLOR][/FONT]
  • Wieso? Wenn ich ein Array deklariere, wird der Speicher für die Felder reserviert und die Variable des Arrays, in diesem Falle charArray, ist ein Zeiger auf das erste Feld des Arrays, also charArray[0]. Dann sollte ich diesen Zeiger doch inkrementieren können?
  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]Eben nicht, habe mich auf o.g Seite mal durchgesehen, du kannst keine Dingen da inkrementieren (weiß grad net wie es heißt)
    Du hast zwar den Speicher beantragt, aber keinen Pointer erstellt.
    Was ein Pointer is weißt du ja, sonst würdest du ja keinen versuchen.

    Für alle die diesen Thread lesen, aber es nicht wissen:

    internetfreak's Gedächtnis schrieb:

    Ein Pointer, englisch für Zeiger, stellt wie der Name sagt einen Zeiger auf ein Objekt dar.
    Besser gesagt zeigt der Zeiger dann auf eine Speicherstelle, an der das Objakt liegt, um es besser wiederzufinden wenn man es brauch, bzw den Zugriff zu erleichtern.
    (Info ohne Gewähr)

    Also musst du nur nach o.g Schemen das passende Schema finden was auf dein Vorhaben passt und dann den Skript entsprechend ergänzen, schon sollte dein Skript klappen.
    Und wenn du meinst, es wäre so wie du sagst, kann ich auch aufhören zu reden und wir warten auf nen Experten.
    Bevors dann doch zu nem Streit kommt, nur weil ich in Sachen C++ kenntnissen noch unter dir liege.
    Aber bissl Ahnung habe ich auch von paar Dingen, in Sachen Pointer half mir halt der nette freundliche Mr. Google[/SIZE][/COLOR][/FONT]
  • char text[200]

    text
    &text[0]

    = die gleiche Speicheradresse.

    Zitat:
    In C ist der Name eines Feldes nämlich ein Pointer auf das erste Element dieses Arrays.

    (C Programmieren von Anfang an, Seite 155 (16. Auflage)

    Das heißt also:
    char testArray[80];
    testArray = Pointer auf testArray[0];

    Und Pointer kann man ja inkrementieren...
  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]Ja Pointer kann man inkrementieren.
    Du hast wahrscheinlich nur einen Fehler in dem Aufbau des Pointers drin, so dass der Compiler weiß dass es ein Pointer ist.
    Mehr will ich ja garnicht sagen.
    Und C ist nicht C++
    C++ unterscheidet sich von C in einigen Dingen (habe die Unterschied nich im Kopf, da mich C nicht interessiert)
    Ich würde jetzt eh sagen wir hören auf zu diskutieren, es bringt zwischen uns beiden ja eh nix, warten wir auf nen Experten oder so, der es weiß, so dass wir dann beide die Lösung wissen.
    Kann ja sein dass ich irgendwo falsch liege, bin halt noch ncih bei Pointern angelengt und weiß daher nur bissl was

    Edit: Du meinst sicher folgendes:
    Alternativ können Sie einen Zeiger verwenden und ihn durch das Array laufen lassen:

    int wert[MAX];
    int *lauf = wert;

    for(i=0; i<MAX; i++)
    {
    *lauf = 0;
    lauf++;
    }

    Hier wird ja auch der Zeiger so inkrementiert wie du es machst, so ist das auch koreekt, aber vorher muss der zeiger als zeiger definiert werden, c++ ist nunmal so pingelig und will die zeiger wissen, bevor man sie nutzt[/SIZE][/COLOR][/FONT]
  • Undead88;92046 schrieb:

    @Well ist das C oder C++ ?

    Ist in diesem Fall nicht relevant.

    Undead88;92046 schrieb:

    Einen Zeiger/Pointer kann ich nicht erkennen.Ich seh eigentlich nur einen Array den du unsachgemäß versuchst zu erweitern.

    Naja, dann nochmal: Wenn ich in C oder C++ ein Array deklariere, wird der Speicher für alle Felder hintereinander reserviert. Der Name des Arrays ist dann ein Pointer auf das erste Feld des Arrays. Ein Beispiel:

    int testArray[3];

    &testArray[0] -> 0x1
    &testArray[1] -> 0x2
    &testArray[2] -> 0x3
    testArray -> 0x1


    Undead88;92046 schrieb:

    Array´s kann man inkrementieren,nur nicht so wie du es versucht.Was internetfreak gepostet hat stimmt soweit ich das sehen kann.

    Auch hier noch einmal: Ich möchte nur den Pointer inkrementieren...

    Undead88;92046 schrieb:

    Ist allerdings C++,falls du C benutz geht das so glaube ich nicht (kenne mich in C nicht gut aus,ich programmiere nur in C++. Also wenn ich mich irre bitte sagen)!

    Wie gesagt... Nicht von Bedeutung.
  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]@Well
    Ob C++ oder C ist relevant.
    Ausserdem behandelt C++ dein Skript als Array, du darfst deine Schreibweise zwar behalten, aber C++ brauch noch den * als Hinweis auf nen Pointer.
    Siehe meine Beispiele.
    Wenn du es nicht glauben willst, tuts mir leid, iwann is hier Schluss, dann musste "dumm sterben" wie man sagen kann. (jetzt nich grad persönlich bzw ernst nehmen)
    Aber is nunmal so, ich hab extra noch per Goole recherchiert oder meinste meine Beispiele hab ich mir grad ausm Ar*** gezogen?

    EDIT: Wenn du dein skript mit C ausdrücken willst, also das C Quellcode ist, dann müssen wir das anders organisieren, daher die Frage ob C oder C++[/SIZE][/COLOR][/FONT]
  • Nein, es ist wirklich nicht relevant. Es gibt in dieser Hinsicht keinen unterschied, ob ich es mit einem C oder einem C++ Kompilierer kompiliere.

    Und ja, es stimmt... Folgendes funktioniert sowohl in C als in C++:
    int testArray[3];
    int *tmpPtr = testArray;
    tmpPtr++;
    tmpPtr++;

    Es liegt aber nicht daran, dass, wie ihr es sagtet, man dem Kompilierer mitteilen muss, wie er Arrays handhabt... Das weiß er schon selber... *rolleyes*
    Ebenso ist es im übrigen auch nicht relevant, welchen Kompilierer man benutzt.

    Es funktioniert nur aus dem Grund nicht, da der Kompilierer das ganze als konstanten Pointer deklariert. Mehr steckt nicht dahintert und erst recht nicht, dass man dem Kompilierer mitteilen müsste, dass die Variable, die er vor 5 Mikrosekunden als Pointer deklariert hat, ein Pointer sein soll... *g*
  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]Wenn alles so ist wie du sagst, warum will der Compiler dann nicht?
    Und eig ists relevant, welche Sprache, zumal man eine C Frage nich im C++ Forum posten sollte.
    Naja das ist aber auch da egal, eher gehts um die Lösung, denn meine Dinge waren alle auf C++ gerichtet, wenn du nun aber versucht C zu programmieren, gehts ja doch wieder bissl anders, weil C andere Vorzüge hat als C++
    Und wie man Arrays handhabt, brauch man dem nich zu sagen.
    Er will in deinem Fall nur wissen, WAS du inkrementieren willst
    Wenn du char Array[0]++ machst, weiß er "aha, ich soll den Index 0 erhöhen"
    Aber dein Beispiel verwirrt ihn atm, daher weiß er nicht was er genau tun soll, ein normales Array inkrementieren oder den Pointer auf das Array, der aber nicht existiert.
    Haste überhaupt mal meine Beispiele angeschaut?
    Glaube ich nicht, sonst hätteste mehr gewusst, weil eig ist das Thema bei den 2 Beispielen gut genug erklärt.

    Naja aber auch egal, wenn du mir und Undead88 nicht glauben willst können wir die Diskussion auch lassen, warteste bis sich halt mal ein C++ Kenner einfindet.[/SIZE][/COLOR][/FONT]
  • Wieso es nicht funktioniert? Hats du meinen Beitrag eigentlich gelesen?
    Der Kompilierer deklariert in diesem Fall charArray als konstanten Pointer auf charArray[0]. Konstant = nicht veränderbar, aus welchem Grund er meckert, wenn ich den Pointer inkrementieren möchte.

    Er will in deinem Fall nur wissen, WAS du inkrementieren willst

    Mein Beispiel verwirrt den Kompilierer sicherlich nicht. Und das weiß er auch: Einen Pointer, der auf charArray[0] zeigt, nämlich charArray. Um es an dieser Stelle nocheinmal zu wiederholen:

    Wenn ich in C oder C++ ein Array deklariere, [SIZE="6"]ist der Name des Arrays, in diesem Fall charArray, ein konstanter Pointer[/SIZE] auf das erste Feld des Arrays, also charArray[0].

    Der Kompilierer sagt also selber: charArray ist ein Pointer. So funktioniert nun eben mal die Handhabung von Arrays in C / C++.
    (Und wenn der Kompilierer das als Pointer deklariert, muss ich ihm nicht noch in der nächste Zeile sagen, was er in der vorherigen Zeile getan hat... Das wäre ja schrecklich.)

    Haste überhaupt mal meine Beispiele angeschaut?
    Glaube ich nicht, sonst hätteste mehr gewusst, weil eig ist das Thema bei den 2 Beispielen gut genug erklärt.

    Naja aber auch egal, wenn du mir und Undead88 nicht glauben willst können wir die Diskussion auch lassen, warteste bis sich halt mal ein C++ Kenner einfindet.

    Sorry, aber in diesem Falle glaube ich einer C Prof. mehr als irgendwelchen Beispielen aus dem Internet.

    Im übrigen, nochmal zum Thema ob C oder C++: Es ist wirklich nicht relevant. I.d.R. kann ein C++ Kompilierer auch ein C-Programm kompilieren.
  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]So das wird wahrscheinlich der letzte Post hier in dem Thema sein, mal abwarten.
    Ich meinte a nich dass du in der NÄCHSTEN zeile den Pointer amchen musst, sondern noch vorm Inkrementieren.
    Ist wie mit Funktionen, die müssen auch vorher bekannt sein, bevor man sie nutzen kann.
    Dazu gibts ja Funktionsprototypen.
    Aber naja, wenn du es halt besser weißt dass ist das nicht meine Sache ich versuche nur zu helfen wie ich kann[/SIZE][/COLOR][/FONT]
  • Oh mann...
    Sry, wenn ich das so direkt sage, internetfreak, aber, was du hier schreibst stimmt größtenteils nicht.

    Wenn du ein Array definierst reservierst du den speicher, ja, und das array selbst (ohne index) IST ein konstanter pointer.
    Und hier liegt der Knackpunkt: Konstant!

    Man kann const variablen nunmal nicht ändern und somit auch net inkrementieren. ;)
    Das is im Prinzip alles.

    (Hier ist es, wie Well schon gesagt hat, völlig unerheblich, ob C oder C++...)
  • [FONT="Comic Sans MS"][COLOR="DeepSkyBlue"][SIZE="3"]Naja ist mir jetzt auch egal, das Problem ist gelöst.
    Ausserdem muss ich sagen, ich bin selbst drauf gekommen gestern, dafür habe ich mir nun die Frage nach dem Sinn gestellt.
    Wenn Well es doch weiß, warum:
    1. sagt er nicht, dass das Thema beendet ist?
    2. fragt er hier dann nach?

    Bei 2. kann es ja sein, dass ers zuerst nicht wusste, aber normalerweise hätte er mal kurz sagen können, ist ok, habs herausgefunden.
    Naja, sowas kann mal passieren, das nächste mal muss ich halt bissl eher aufpassen *mir vorn kopf hau*
    Komisch aber, dass es mir nie aufgefallen ist, erst als ich per ICQ nen Hinweis bekam von Undead, dann wars mir klar und dann kam die Frage nach dem Sinn.

    Ok aber nun Ende hier, ich amche Dicht.
    Wenn Well was sagen will, kann ers mir per PM schicken, ich hätte evt doch mal gerne meine Fragen beantwortet^^

    #closed
    Und THX an Tom, durch dich weiß ich wieder mal bissl mehr.
    Sorry dass ich halt doch so unerfahren bin was Pointer angeht, bei dem Kapitel bin ich noch nicht angelangt^^[/SIZE][/COLOR][/FONT]