C Aufgaben BITTE um Korrektur



  • Hallo. Ich soll folgende Aufgaben machen. Also:

    Es gibt drei C-Deklarationen:
    char *s;
    char zeile[80];
    char *mach_es();

    Man soll jetzt sagen, welche folgender Operationen sinnvoll ist und was diese bewirken:

    a) s = zeile;
    b) s++;
    c) zeile++;
    d) s += 7;
    e) &zeile[0];
    f) *zeile;
    g) &(zeile[1])-1;
    h) mach_es(&zeile[7]);

    Nicht, dass ihr mich falsch versteht. Ich möchte hier nicht einfach die Lösungen erfragen, sondern vielmehr Erklärungen. Ich versteh nicht, ob man z.B. ein Array einfach so inkrementieren kann oder was z.B. bei a passiert.



  • Count144 schrieb:

    ob man z.B. ein Array einfach so inkrementieren kann

    Nein.

    Count144 schrieb:

    oder was z.B. bei a passiert.

    Danach zeigt s auf das erste Element von zeile.

    Noch Fragen?



  • Da also zeile[80] ein Array ist, ist das unter c) nicht möglich?

    aber b) ist möglich? Man inkrementiert den wert der Variablen s, aber bei den Zeigern ist das doch problematisch?



  • Und kann man einen Zeiger auf ein Array(siehe f)) bilden? Wie würde das aussehen?



  • c) ist nicht möglich, da der Name eines Arrays eigentlich nur ein konstanter Zeiger auf das erste Element ist. Wenn das gehen würde dann könnte der array ja am Ende der Funktion nicht mehr automatisch freigegeben werden,da es ja keinen Zeiger mehr auf den Anfang gäbe.
    Ein Zeiger auf ein Array ist gar kein Problem:

    char **ptr;
    char arr[80];
    ptr=&arr;/*arr ist konstanter Zeiger auf das erste element*/
    

    b) nenn sich zeigerarithmetik, ist in C eigentlich relativ gebräuchlich. Wichtig ist dass ptr++ den Zeiger um die Größe eines Elements (bei einem char* um 1, bei einem int* um 4(plattformabhängig!)) versetzt.



  • Count144 schrieb:

    Hallo. Ich soll folgende Aufgaben machen. Also:

    Es gibt drei C-Deklarationen:
    char *s;
    char zeile[80];
    char *mach_es();

    Man soll jetzt sagen, welche folgender Operationen sinnvoll ist und was diese bewirken:

    a) s = zeile;
    b) s++;
    c) zeile++;
    d) s += 7;
    e) &zeile[0];
    f) *zeile;
    g) &(zeile[1])-1;
    h) mach_es(&zeile[7]);

    a) Sinnvoll, s zeigt jetzt auf &zeile[0]
    b) Sinnvoll, s zeigt jetzt auf &zeile[aktuelle position] + 1byte, was der größe eines char enspricht.
    c) Nicht sinnvoll, zeile muss konstant auf &zeile[0] zeigen. Sollte nicht mal compilieren.
    d) Sinnvoll, siehe b).
    e) &zeile[0] existiert zwar, macht aber halt nichts..
    f) Hm.. naja abgesehen davon dass das auch nichts macht, zeigt *zeile wohl auch auf &zeile[0]. Wirklich sinnvoll finde ich sowas aber nicht..
    g) Zeigt auch auf &zeile[0] ist aber auch unnötig..
    h) Könnte sinnvoll sein, aber mach_es() ist ja nicht bekannt. Falls mach_es() wirklich exakt als "char *mach_es()" deklariert ist macht es natürlich keinen sinn einen Parameter zu übergeben und würde auch nicht compilieren.



  • cooky451 schrieb:

    h) Könnte sinnvoll sein, aber mach_es() ist ja nicht bekannt. Falls mach_es() wirklich exakt als "char *mach_es()" deklariert ist macht es natürlich keinen sinn einen Parameter zu übergeben und würde auch nicht compilieren.

    doch, Funktionen ohne Parameter kann man beliebig viele Argumente übergeben. Wäre mach_es so deklariert:

    char *mach_es(void);
    

    dann wär's ein Compilerfehler. Von daher h) ist sinnvoll.



  • Ich kann mir alles sinnvoll vorstellen, kommt immer auf den aufrufenden Kontext an, insofern ist die Fragestellung ungenau/undefiniert/dilettantisch.
    c) wäre z.B. durchaus möglich in Funktionen wie

    void bla(char zeile[80])
    {
      zeile++;
      ...
    }
    

    oder auch exakt wie vorgegeben

    void bla(zeile)
    char zeile[80];
    {
      zeile++;
      ...
    }
    


  • nein, c) ist definitiv falsch, weil es ein Compiler Fehler. Dafür sind die Deklarationen in der Aufgabe da (die Rede war von Deklarationen und nicht Parameter).

    Über die Sinnhaftigkeit der Zeilen lässt sich schon streiten, da fehlt der Kontekt. Bei c) kann man aber definitiv seibn, dass das falsch ist.


Anmelden zum Antworten