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)
. Weilargv
einchar **
ist, ist das dann vom Typchar *
, 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*) - weilchar*
sozusagen der "Basistyp" dafür ist.Vielleicht wird es klarer, wenn du im Kopf mal
char *
durchstring
ersetzt:
int x(int argv, string *argv)
- dann ist da auch nur noch ein * und du siehst leichter, dassargv[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...