Brauche Hilfe bei Pointern



  • Zurück zu meiner ursprünglichen Frage:
    Wie kann ich bei meinem Code Array durch Zeiger ersetzen (ohne es zu ändern)?


  • Mod

    Joe1903 schrieb:

    Zurück zu meiner ursprünglichen Frage:
    Wie kann ich bei meinem Code Array durch Zeiger ersetzen (ohne es zu ändern)?

    Da ist kein Array!

    Joe1903 schrieb:

    Auch wenn im main char s[100]; ist?

    Ja. Dann zeigt der Zeiger eben auf ein Array. Er ist immer noch ein Zeiger. Eine Variable kann (in C) nicht einfach ihren Typ ändern, bloß weil die Funktion, in der sie steht, mit einem anderen Argument aufgerufen wird.



  • Sind im K&R nicht auch Beispiele für strcpy in Array- und Pointerschreibweise?
    ^Ich hab den gerade nicht zur Hand^



  • SeppJ schrieb:

    Joe1903 schrieb:

    Zurück zu meiner ursprünglichen Frage:
    Wie kann ich bei meinem Code Array durch Zeiger ersetzen (ohne es zu ändern)?

    Da ist kein Array!

    Um es nochmal ganz klar zu machen: in der main()-Funktion, bzw. in dem Scope, wo du das Array definierst, hast du ein waschechtes Array. Nur übergeben kannst du es nicht, stattdessen aber dessen Adresse, also einen Pointer auf das erste Element des Arrays. Wenn du nun in der Funktion, in dem du die Adresse des Arrays weiterreichst, auch die Größe brauchst, so gibst du als zweiten Parameter dessen Größe mit an. Arrays sind implizit in Pointer konvertierbar (aber nicht umgekehrt), das heißt aber nicht, dass ein Array ein Pointer ist! Einen Pointer jedoch kannst du genau so, wie einen Array benutzen, du kannst ihn subscripten (also mit [] ), du kannst ihn dereferenzieren (also mit * ).

    Aber bitte, behalte fest, dass ein Array kein Pointer ist. Er ist lediglich konvertierbar.



  • Joe1903 schrieb:

    Hallo.Ich bin neu in C und muss mich schnellstmöglich einarbeiten.

    Achso: einen wichtigen Punkt habe ich dann noch: aktivier Warnungen in Deinem Compiler, bzw. dreh das Warnlevel auf die empfindlichste Stufe hoch.



  • Hallo Joe1903,

    noch etwas detaillierter als MrDoe es beschrieben hat.
    Die beiden folgenden Zeilen sind äquivalent:

    s[i];
    *(s+i);
    

    Ebenso

    i[s];
    *(i+s);
    

    (auch wenn man dies in Produktivcode eher nicht so schreiben würde).

    char *s = "Test";
    // alternativ: char[] s = "Test"
    
    putchar(s[0]);
    putchar(*(s+1));
    putchar(2[s]);
    putchar(*(3+s));
    

    gibt wieder "Test" aus, s.a. http://ideone.com/0lGWEo



  • Th69 schrieb:

    char *s = "Test";
    // alternativ: char[] s = "Test"
    

    Unsinn. Da ist nichts alternativ. Das sind grundsätzlich unterschiedliche Definitionen.



  • Furble Wurble schrieb:

    So steht's bei K&R:

    /* getline: read a line into s, return length
     */
    int getline_kr(char s[],int lim)
    {
      int c, i;
      for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
      if (c == '\n') {
        s[i] = c;
        ++i;
      }
      s[i] = '\0';
      return i;
    }
    

    Du könntest jetzt Z. 3 ersetzen durch

    int getline_kr(char *s,int lim)
    

    und wärst fertig.

    Unsinn.

    int getline_kr(char s[],int lim)
    int getline_kr(char *s,int lim)
    

    sind in jeglicher Hinsicht identisch.



  • Th69 schrieb:

    char *s = "Test";
    // alternativ: char[] s = "Test"
    ...
    

    Einspruch! Das ist nicht das Selbe.

    Ersteres ist ein Pointer auf {'T','e','s','t','\0'}, das üblicherweise in einem schreibgeschützten Bereich gespeichert ist.
    Letzteres ist ein Array aus 5 Zeichen, das mit {'T','e','s','t','\0'} initialisiert wird und dessen Inhalt auch verändert werden kann.

    Probier doch mal:

    char *a = "Test";
    char b[] = "Test";
    
    printf ("%p %p\n", a, &a);  // unterschiedliche werte. dereferenzierung klappt
    printf ("%p %p\n", b, &b);  // 2 mal gleicher wert, dereferenzierung nicht möglich
    


  • Wutz schrieb:

    Furble Wurble schrieb:

    So steht's bei K&R:

    /* getline: read a line into s, return length
     */
    int getline_kr(char s[],int lim)
    {
      int c, i;
      for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
      if (c == '\n') {
        s[i] = c;
        ++i;
      }
      s[i] = '\0';
      return i;
    }
    

    Du könntest jetzt Z. 3 ersetzen durch

    int getline_kr(char *s,int lim)
    

    und wärst fertig.

    Unsinn.

    int getline_kr(char s[],int lim)
    int getline_kr(char *s,int lim)
    

    sind in jeglicher Hinsicht identisch.

    So würde es für den obigen Code aussehen:

    int getline_kr(char *s,int lim)
    {
        int c;
        char *t=s;
    
        while(--lim >0 && (c=getchar())!=EOF && c!='\n')
            *s++ = c;
        if( c == '\n')
            *s++ = c;
    
        *s= '\0';
    
        return s-t;
    }
    

    Aber wie sieht es für meinen modifizierten Code aus?

    int mgetline(char s[], int lim)
    {
       int c, i, j;
       for (i=0;(c=getchar() != EOF && c!='\n'; i++)
       {
          if (j<lim-1)
             s[j++]=c;
       }
    
       if (c == '\n)
       {
          if (j<lim-1)
             s[j++]=c;
             i++;
       }
    
       s[j]='\0';
    
       return i;
    }
    

  • Mod

    Ich verstehe nicht, was du wissen möchtest. Besteht immer noch Unklarheit zu Pointern und Arrays? Wurde schon alles 3x erklärt.

    Willst du wissen, wieso dein modifizierter Code nicht funktioniert? Der compiliert nicht einmal, die Syntaxhervorhebung im Forum zeigt dir warum.



  • Meine Frage ist wie würde mein modifizierter Code mit Pointern aussehen?
    Ich krieg es nicht richtig hin und möchte wissen,wie es aussehen würde,damit ich es verstehe



  • DU NUTZT SCHON POINTER1111



  • Ich weiß aber nicht genau wie ich wie in meinem Fall mit 2 Variablen mache.Bzw. kann jemand ein Bsp geben anhand des mod. Codes?Kann jemand wenn auch nur die for-Schleife den mod. Code so schreiben wie im dem Bsp dass ich gepostet habe??



  • Er möchte von der Arrayschreibweise a[] weg zur Pointerschreibweise *a.
    Warum auch immer.

    Statt s[j++]=c; schreibst du *s++=c;j++; ⚠ Achte auf den Scope
    Statt s[j] schreibst du *s

    ⚠ Das gilt aber nur hier in diesem Beispiel.

    Du könntest noch i und j zusammenfassen.



  • Danke.
    Und wie ist der Unterschied bei der Initialiserung?In dem Originalcode macht man ja
    char *t=s;

    Mach ich dann
    char *t=s;
    int c,j;

    ?

    Inwiefern kann ich i und j zusammenfassen?Aber in diesem Bsp zählt i die Zeichen der Eingabe und j setzt den String zusammen.Kann man es trotzdem zusammenfassen?



  • DirkB schrieb:

    Er möchte von der Arrayschreibweise a[] weg zur Pointerschreibweise *a.
    Warum auch immer.

    Statt s[j++]=c; schreibst du *s++=c;j++; ⚠ Achte auf den Scope
    Statt s[j] schreibst du *s

    ⚠ Das gilt aber nur hier in diesem Beispiel.

    Du könntest noch i und j zusammenfassen.

    Danke.
    Und wie ist der Unterschied bei der Initialiserung?In dem Originalcode macht man ja
    char *t=s;

    Mach ich dann
    char *t=s;
    int c,j;

    ?

    Inwiefern kann ich i und j zusammenfassen?Aber in diesem Bsp zählt i die Zeichen der Eingabe und j setzt den String zusammen.Kann man es trotzdem zusammenfassen?



  • Warum möchtest du denn noch den Pointer t haben?
    Den Ursprungswert von s brauchst du doch nicht mehr.

    Joe1903 schrieb:

    Inwiefern kann ich i und j zusammenfassen?Aber in diesem Bsp zählt i die Zeichen der Eingabe und j setzt den String zusammen.Kann man es trotzdem zusammenfassen?

    Wenn j>=lim-1 ist, dann gilt das auch für i

    Die Aufgabe von j (der Index im Array) übernimmt jetzt der Pointer.



  • DirkB schrieb:

    Warum möchtest du denn noch den Pointer t haben?
    Den Ursprungswert von s brauchst du doch nicht mehr.

    Joe1903 schrieb:

    Inwiefern kann ich i und j zusammenfassen?Aber in diesem Bsp zählt i die Zeichen der Eingabe und j setzt den String zusammen.Kann man es trotzdem zusammenfassen?

    Wenn j>=lim-1 ist, dann gilt das auch für i

    Die Aufgabe von j (der Index im Array) übernimmt jetzt der Pointer.

    Ist dann return s; ?



  • s ist vom Typ char* (ein Zeiger auf char)
    Dein Rückgabewert soll aber ein int sein.
    Die passen nicht zusammen.

    Und nochmal selber überlegen:
    Welchen Wert möchtest du zurück geben?
    (bitte einen vollständigen Satz, danach kannst du die Variable/Berechnung nennen, die diesen Wert hat)


Anmelden zum Antworten