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 weiterDas
argv[i]ist also*(argv + i). Weilargveinchar **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 *durchstringersetzt:
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...