Frage zu Quelltext/Zeigerarrays



  • Hallo,

    ich habe eine Frage zu folgenden beiden Quelltexten:

    #include <stdio.h>
    #include <stdlib.h>
    
    void main(int argc, char *argv[])
    {
    	int i;
    
    	for (i=1; i<argc; i++)
    		printf("%c\n",122-(*argv[i]-97));
    
    	system ("pause");
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void main(int argc, char *argv[])
    {
    	int i;
    
    	for(i=0; i<argc; i++)
    		printf("%c\n",219 - argv[1][i]);
    
    	system("pause");  
    }
    

    Die Funktion ist bei beiden Programmen die gleiche: Ich rufe über die Konsole (cmd.exe) in dem entsprechenden Pfad meine von Microsoft Visual C++ erstellte *.exe auf (nennen wir sie mal "Wandle.exe"). Nach Eingabe von z. B. "Wandle a b c" im oberen Programm bzw. "Wandle abc" im unteren Programm bekomme ich als Ausgabe "z y x" bzw. "zyx".

    Nun meine Frage: Im oberen Programm brauche ich vor "argv[i]" ein "", weil ich das Array vorher ja als Zeigerarray deklariert habe, richtig?
    Aber warum muss vor "argv[1][i]" kein "
    "?



  • Erst mal, das was du hier machst stinkt nur so nach C.
    Zweitens ist system böse.
    Drittens ist a[n] dasselbe wie (a + n), daher ist [][] schon eine doppelte Dereferenzierung.
    Viertens, heißt es int main(int argc, char
    * argv).

    Fünftens, hier die C++ Variante: http://ideone.com/nxEZM



  • 314159265358979 schrieb:

    Fünftens, hier die C++ Variante: http://ideone.com/nxEZM

    Das Beispiel ist (noch) nicht Standardkonform, außerdem tut er was ganz anderes.



  • Du kannst auch auto durch std::vectorstd::string::const_iterator ersetzen wenns dir Spaß macht, ich habe auto verwendet, um mich auf das Wesentliche zu konzentrieren. Und was er jetzt mit den einzelnen Argumenten tut, tut nichts zu Sache - ich wollte lediglich die allgemeine Verarbeitung in C++ vorzeigen.



  • Danke für eure schnellen Antworten.
    Sorry, hab ich aus Versehen ins falsche Forum geschrieben.

    Aber so wirklich kapiere ich das trotzdem noch nicht, warum ich jetzt einmal "*" brauche und einmal nicht.



  • Harry87 schrieb:

    Aber so wirklich kapiere ich das trotzdem noch nicht, warum ich jetzt einmal "*" brauche und einmal nicht.

    Das * steckt in dem einen Fall schon im [] mit drin. Falsch, eigentlich in beiden. Jedes [] enthält ein * aufgrund der folgenden Definition: a[b] := *(a+b) . Wenn du also argv[1][i] hast, ist das gleichbedeutend mit *(*(argv + 1) + i) (schreibt so aber keiner, nur fürs Verständnis).

    Der Code ist trotzdem ... nicht besonders. Man versteht durch scharfes Nachdenken noch viel zu gut, was er machen soll. 🙂



  • 314159265358979 schrieb:

    Fünftens, hier die C++-Variante: http://ideone.com/nxEZM

    Wenn jemand schon etwas als C++ Variante anpreist, soll er auch die echte nehmen: http://ideone.com/fDuJ2

    Ein std::vector als Wrapper eines Arrays ist eigentlich nie sinnvoll.



  • 314159265358979 schrieb:

    Viertens, heißt es int main(int argc, char** argv).

    Bullshit! Ob man char* argv[] oder char** argv schreibt ist dem Standard egal.



  • Bashar schrieb:

    Das * steckt in dem einen Fall schon im [] mit drin. Falsch, eigentlich in beiden. Jedes [] enthält ein * aufgrund der folgenden Definition: a[b] := *(a+b) . Wenn du also argv[1][i] hast, ist das gleichbedeutend mit *(*(argv + 1) + i) (schreibt so aber keiner, nur fürs Verständnis).

    Der Code ist trotzdem ... nicht besonders. Man versteht durch scharfes Nachdenken noch viel zu gut, was er machen soll. 🙂

    Hm okay also die Definitionen hab ich soweit verstanden. Aber das erklärt mir irgendwie immer noch nicht, warum das * dann bei dem anderen Array wegfällt...?



  • EOutOfResources schrieb:

    Bullshit!

    Ruhig, Mr pi bezog sich doch wahrscheinlich lediglich auf das void vor dem main.



  • Harry87 schrieb:

    Hm okay also die Definitionen hab ich soweit verstanden. Aber das erklärt mir irgendwie immer noch nicht, warum das * dann bei dem anderen Array wegfällt...?

    Dann wende die Definition doch mal auf deinen Fall an.



  • yahendrik schrieb:

    Ruhig, Mr pi bezog sich doch wahrscheinlich lediglich auf das void vor dem main.

    Ups, das habe ich übersehen. Ich nehme alles zurück.



  • fDuJ2 schrieb:

    314159265358979 schrieb:

    Fünftens, hier die C++-Variante: http://ideone.com/nxEZM

    Wenn jemand schon etwas als C++ Variante anpreist, soll er auch die echte nehmen: http://ideone.com/fDuJ2

    Ein std::vector als Wrapper eines Arrays ist eigentlich nie sinnvoll.

    Im Normalfall will man die Argumente irgendwo speichern und damit etwas tun. 😉


Log in to reply