Hickhack0 schrieb:
> und warum funktioniert dann "i"? i ist doch nicht weniger Variable als
> *argv[]
*argv[] ist keine Variable. argv[][] ist die Variable. Der
> oder anders: &i entspricht argv[].
Nein.
> oder ist für den Compiler "i" genauso ein Zeiger mit einer
i ist kein Zeiger. Du schmeisst da einiges durcheinander.
> Würde in meiner Logik gerade heißen: printf braucht speicheradressen als
> input, keine Werte.
printf braucht das als Argument, was in der Formatliste steht.
Steht dort ein %d , dann muss das entsprechende Argument ein int-Wert
sein.
Steht dort ein %s, dann muss das entsprechende Argument eine Adresse
sein, an der der String beginnt.
Es sind die Angaben im Formatstring, die printf leiten, wie Argumente zu
bewerten sind. Daher ist es auch ausserordentlich wichtig, dass die
Angaben im Formatstring und die tatsächlichen Argumente übereinstimmen.
(Und da das fehleranfällig und schlecht wartbar ist, hat man sich in C++
mit den streams dafür einen komplett anderen Mechanismus einfallen
lassen)
printf( "%d", 5 );
printf( "%d", 8 + 4 );
printf( "%d", i );
printf( "%d", 2 * ( i + j ) );
In der Formatliste steht durch das %d, dass das zugehörige Argument ein
int ist. Wie dieser int zustande kommt, ist unerheblich. Hauptsache ein
int.
char * Text1 = "Juhu";
char Text2[] = "Moin";
printf( "%s", "Hallo" );
printf( "%s", Text1 );
printf( "%s", Text2 );
printf( "%s", Text2 + 2 );
In der Formatliste steht durch das %s, dass das zugehörige Argument die
Adresse eines Strings ist. Der String wird ab der angegegebenen Adresse,
bis zum Auftreten eines '\0' Bytes im String ausgegeben.
Du hast
char * argv[]
also ein Array von Zeigern, wobei jeder Zeiger die Adresse eines Strings
enthält
argv
+-----------+ +------------------+
| o-------------------->| "Argument1" |
+-----------+ +------------------+
| o------------------+ +--------------------+
+-----------+ +--->| "Argument2" |
| o------------+ +--------------------+
+-----------+ | +-------------------+
| NULL | +---->| "Argument3" |
+-----------+ +-------------------+
Du willst nacheinander jeden Zeiger an printf übergeben, weil printf ja
im Falle von %s die Startadresse des Strings haben möchte und diese
Startadressen ja im Array gespeichert sind.
for( i = 0; i < argc; ++i )
printf( "%s", argv[i] );
argv[i] gibt den i-ten Zeiger aus dem Array, also die Startadresse des
i-ten Strings. Genau das was %s haben möchte.
Besorg dir ein Buch. Online Tutorien brings in den seltesten Fällen und
auf deinem Level ist Google wenig hilfreich.