Sup!
Variable und &Variable?
Variable und Speicher-Adresse der Variable.
mit "&" adressiert man den speicher der variable? was soll der unterschied sein?
int a = 4;
printf("%d", a);
4
printf("%p", &a);
0x80001312 (oder so...)
char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)
char * String[] = "bla bla bla";
heisst:
String[]
String ist ein Array
* String[]
String ist ein Array von Zeiger(n)
char * String[]
String ist ein Array von Zeiger(n) auf char
char * String[] = "bla bla bla";
String ist ein Array von Zeiger(n) auf char, dessen erstem Element die Adresse der Zeichenkettenkonstante "bla bla bla" zugewiesen wird.
Eigentlich scheint das zuviel des Guten zu sein.
char String[] = "bla bla bla";
(String ist ein Array von char, dem "bla bla bla" zugewiesen wird) sollte reichen.
printf("%s", String);
und
printf("%s", &String);
Bei einem Array repräsentiert der Variablenname die Basis-Adresse des Arrays, die natürlich mit der Adresse des ersten Elements übereinstimmt.
Wenn
char String[3];
dann gilt:
String == &String[0]
String[2] == *(String + 2 * sizeof[char]);
Hier ist zu beachten, dass es den "*"-Operator zweimal gibt.
Einmal als Multiplikations-Operator (mit zwei Operanden), einmal als Dereferenzierungs-Operator (mit einem Operanden, der rechts vom Operator stehen muss).
int a = 2;
int * b;
b = &a;
==>
*b == a == 2
Aber zurück zu Deinem Beispiel:
printf("%s", String);
und
printf("%s", &String);
Die Verwendung des Adress-Operators ist hier unnötig, denn String ist bereits die Adresse der Zeichenkette.
Freundlicherweise liefert C als "Adresse einer Adresse" die Adresse zurück, d.h., der Adress-Operator tut quasi gar nichts.
Wie auch immer, Du solltest ein gutes C-Buch lesen ;-)
Gruesse,
Bio