Main Übergabeparameter als Zeiger, aber Aufruf der Inhalte ohne Dereferenzierung?



  • Hallo zusammen,

    verstehe noch nicht ganz die Logik mit den Zeigern bei der Parameterübergabe in main. Normalerweise schreibe ich in einen Zeiger ja die Adresse einer Variablen und mit dem * Operator greife ich auf den Inhalt zu

    int x=7;
    int *adresseVonX = &x;
    *adresseVonX = 77;
    

    Im main kann ich die Inhalte des Arrays dann aber ohne * ansprechen, warum?

    int main(int argc, char **argv) // oder int main(int argc, char *argv[])
    {
    	int i;
    
    	for (i = 0; i < argc; i++) {
    		cout << "Parameter " << i << ": " << argv[i] << endl;  // müsste hier nicht *argv[i] stehen?
    	}
    }
    

    Danke udn viele Grüße
    Jini



  • Das hängt davon ab, was du ansprechen möchtest.

    a[i] ist identisch mit *(a+i)

    Also ist [] schon eine Dereferenzierung.

    mit argv[i] greifst du auf ein char* zu (also ein C-String)
    mit *argv[i] greifst du auf ein char zu (ein einzelnes Zeichen)



  • Hallo Jini. Das hat nichts mit "main" zu tun, sondern allgemein damit, dass die Schreibweise mit eckigen Klammern bei Pointern folgendes bedeutet:

    int *pointer;
    *pointer == pointer[0]
    *(pointer + 1) == pointer[1]
    *(pointer + 2) == pointer[2]
    // und so weiter
    

    Das argv[i] ist also *(argv + i). Weil argv ein char ** ist, ist das dann vom Typ char *, also ein Pointer auf das erste Zeichen eines nullterminierten Strings. Mit *argv[i] würdest du das erste Zeichen dieses Strings ausgeben, nicht den gesamten String. Dies ist ein Spezialfall und gilt nur für nullterminierte Strings (also char*) - weil char* sozusagen der "Basistyp" dafür ist.

    Vielleicht wird es klarer, wenn du im Kopf mal char * durch string ersetzt:
    int x(int argv, string *argv) - dann ist da auch nur noch ein * und du siehst leichter, dass argv[i] dann der i-te String wäre.

    Ich hoffe, das hilft ein bisschen!



  • Ja, klasse, danke! Muss ich mir nochmal in Ruhe zu Gemüte führen...


Anmelden zum Antworten