Zeiger zum String funktioniert nicht....

Es gibt 26 Antworten in diesem Thema, welches 3.762 mal aufgerufen wurde. Der letzte Beitrag (2. November 2011 um 16:49) ist von sauhund.

  • Array-String mit Zeiger funktioniert nicht.
    Gibt es dafür ein Ersatz?

    danke.

    gruss


    Code
    int main(void)
    {
    char *string[]="00000000";
    string[]=683;
    *string='a';
    string=string+1;
    *string='b';
    }
  • Was soll

    Code
    string[]=683;

    denn machen?

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Bin mir nicht 100%ig sicher, aber Dein "String" ist doch ein Char-Array oder nicht? Demnach suchst Du vermutlich nach so etwas:
    Bitte melde dich an, um diesen Link zu sehen.

    Grundsätzlich: immer schön zwischen dem Array selbst und dem Zeiger darauf unterscheiden.

  • char *string[]="00000000" oder dieses char *string[12] funktioniert auch nicht
    string[]=683;

    Ich wollte die Adresse 683 zuweisen.

    danke.

    gruss

  • Hallo danke an euch.

    Spider, du hast es gefunden.
    Das Buch habe mir runter geladen und werde es auf meinem Laser gleich ausdrucken.


    danke.

    gruss

  • char *string[]="00000000";


    Das ist ein Array unspezifizierter Länge aus Zeigern auf chars, durch die Initialisierung wird eine Länge von 1 vorgegeben und dieses eine Element enthält einen Zeiger auf die Zeichenfolge "00000000" (plus einem 0-Byte als Endmarker)

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Zitat

    Das Buch habe mir runter geladen und werde es auf meinem Laser gleich ausdrucken.


    aber vorsicht, auf keinen fall lesen, nicht das du ausversehen was lernst =P

  • aber vorsicht, auf keinen fall lesen, nicht das du ausversehen was lernst =P


    Hallo Sauhund, ich grüss dich. Wie schauts aus?
    Ich lese es erst wenn ich in meiner sogenannten Leseecke sitze beim Bier, vielleicht heute Abend schon.

    gruss

  • Das Buch habe mir runter geladen und werde es auf meinem Laser gleich ausdrucken.


    Lohnt sich zu lesen. Das Ding hat mich zumindest seinerzeit sicher durch den ganzen "praktischen Programmier-Teil" der Informatik I Vorlesung gebracht.

  • Mache mit den Zeiger irgendein Fehler.
    Ich möchte mit der Vorgehensweise die 4 Werte mit dem Zeiger ab Adresse 681 ablegen. Aber es tut sich nichts.

    gruss

  • Mit *p_satz= ... änderst Du ja nur den Wert an der Stelle p_satz, aber nichts danach. Dafür musst Du entweder eine Schleife nehmen, oder aber die String-Funktionen nutzen, wie etwa strcpy :

    Bitte melde dich an, um diesen Link zu sehen.

    C++ ist da wesentlich weiter, aber das geht wohl nicht auf den kleinen Kisten...

    Ciao,
    Andreas

    Edit: peiselulli war schneller...

  • So funktioniert das auch nicht mit den Zeigern in C. Es läuft sozusagen "andersherum":
    z.B.: Du legst ein Array an und dann einen Zeiger, der auf das erste Element des Arrays zeigt. Die Zeigervariable selbst enthält dann eben die Speicheradresse des ersten Elementes.
    Durch Operationen auf der Zeigervariable ist es dann möglich einzelne Elemente des Arrays indirekt anzusprechen.
    Die Zeiger haben hingegen *nicht* die Funktion, dass man mit diesen bestimmen könnte, an welcher Speicherstelle das Array angelegt werden soll.

  • Noch eine kleine Zusatzfrage zu dem Thema: vor zu langer Zeit, um es hier zuzugeben :) gab es mal Diskussionen, ob man schneller mit Pointern oder mit Array-Indizes auf Array-Elemente zugreift. Hintergrund war wohl der, dass zu dieser Zeit schon erste CPUs verfügbar waren, die den Index in einem Register hielten, das Register inkrementierten und dann relativ zum Registerinhalt zugreifen konnten, Hat man mal probiert, was auf der 65xx Serie schneller ist?

    Vielen Dank im Voraus,
    Andreas

  • Also z.b. so:

    Code
    char *p_satz = 681;
    
    
    p_satz[0] = '-';
    p_satz[1] = '1';
    p_satz[2] = '8';
    p_satz[3] = '6';

    Macht das Sinn für dich?

    Alternativ geht's auch so:

    Code
    char *p_satz = 681;
    
    
    *p_satz = '-';
    p_satz = p_satz+1;
    *p_satz = '1';
    p_satz = p_satz+1;
    *p_satz = '8';
    p_satz = p_satz+1;
    *p_satz = '6';

    Und dasselbe nochmal in kurz:

    Code
    char *p_satz = 681;
    
    
    *p_satz++ = '-';
    *p_satz++ = '1';
    *p_satz++ = '8';
    *p_satz++ = '6';

    Und die Moral von der Geschicht': Ein Pointer ist ein Array und ein Array ist ein Pointer. :)

  • Hmmh...bei 4 Zeichen könnte man ggf. ja auch tricksen, indem man auf einen Pointer auf Long castet und dann zuweist...bringt zwar wohl auf einem 8-Bitter nix, aber man könnte es ja mal erwähnt haben... :)

  • Zitat

    Noch eine kleine Zusatzfrage zu dem Thema: vor zu langer Zeit, um es hier zuzugeben gab es mal Diskussionen, ob man schneller mit Pointern oder mit Array-Indizes auf Array-Elemente zugreift. Hintergrund war wohl der, dass zu dieser Zeit schon erste CPUs verfügbar waren, die den Index in einem Register hielten, das Register inkrementierten und dann relativ zum Registerinhalt zugreifen konnten, Hat man mal probiert, was auf der 65xx Serie schneller ist?


    "vor langer zeit" musste man sich da noch gedanken machen - heutzutage machen moderne kompiler aus equivalentem c-code aber praktisch immer den exakt gleichen asm code, so das das völlig egal ist :)

    was cc65 angeht, da kommt es oft auf den individuellen codeschnipsel an was nun die bessere variante ist, das kann man so pauschal nicht sagen. in einem fall wie dem hier beispielhaft gezeigten wären absolute array indizes besser, weil die direkt (zur compile-zeit) in absolute pointer umgerechnet werden können.

  • Zitat

    Hmmh...bei 4 Zeichen könnte man ggf. ja auch tricksen, indem man auf einen Pointer auf Long castet und dann zuweist...bringt zwar wohl auf einem 8-Bitter nix, aber man könnte es ja mal erwähnt haben... :)


    Bringt Dir auf einen entsprechenden (moderneren) Prozessor und ungerader Adresse eine Exception !
    Also schnell abgewöhnen ...

  • Zitat

    Bringt Dir auf einen entsprechenden (moderneren) Prozessor und ungerader Adresse eine Exception !


    ääääh. nein. naja. nicht wirklich. die wenigsten machen das, selbst ARM kann auf ungerade adressen zugreifen mitlerweile :)

    bei halbwechs modernen compilern sollte man aber eher statt dessen einfach memcpy aufrufen, und der compiler macht dann das "richtige" draus. bei cc65 natürlich eher keine gute idee =)