C- verständniss der Grundlagen
bleicher
- programmiertechnik
Grüße,
ich versuche zwischendurch imme rwieder mal was über C- zu lesen.
Dabei stieß ich auf folgendes Problem -
Variable und &Variable?
mit "&" adressiert man den speicher der variable? was soll der unterschied sein?
was wäre der unterschied zwischen
char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)
printf("%s", String);
und
printf("%s", &String);
?
in tutorials wird zwar erklärt dass es zeiger sind, aber was heißt es "effektiv"?
das ist leider das prblem mit den kurzen internettutorials - da wird zwar erklärt was man machen muss um effekt "E" zu erzielen, aber Details....
MFG
bleicher
Hallo,
Dabei stieß ich auf folgendes Problem -
Variable und &Variable?
mit "&" adressiert man den speicher der variable? was soll der unterschied sein?
Der Ausdruck »variable« gibt Dir den Wert der Variable, der Ausdruck »&variable« die Speicheradresse der Variable.
Beispiel:
#include <stdio.h>
#include <sys/types.h>
int main (int argc, char **argv) {
int var = 3;
printf ("%d\n", var);
// Auf 64bit-Systemen %016x verwenden
printf ("%08x\n", &var);
return 0;
}
Ergibt bei mir:
3
bfec32a0
Der Wert der Variable ist also 3 und der wird an Adresse 0xbfec32a0 gespeichert (das wird bei Dir mit Sicherheit variieren).
was wäre der unterschied zwischen
char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)
char *String[]="bla bla bla" ist *GANZ FALSCH*.
Entweder:
char *string = "bla bla bla";
oder
char string[] = "bla bla bla";
oder wenn Du ein Array von Strings haben willst, dann:
char *string[] = {
"bla bla bla",
"blub blub blub",
...
};
in tutorials wird zwar erklärt dass es zeiger sind, aber was heißt es "effektiv"?
Ich kann Dir, was Zeigerarithmetik angeht, wirklich nur empfehlen, Dir mal Kernighan/Ritchie, "Programmieren in C", 2. oder 3. Auflage durchzulesen. Zeiger sind nichts, was man in einem Forenposting mal eben kurz erklärt. Da steckt eine Menge Informationen dahinter und Deine Fragen zeigen, dass Du erst noch *ganz* am Anfang stehst.
Viele Grüße,
Christian
was wäre der unterschied zwischen
char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)
printf("%s", String);
und
printf("%s", &String);
Der Typ 'char' bezeichnet genau ein Zeichen (normalerweise
ein Byte). Ein String wird in C als ein Array von 'char'-Zeichen
gehandhabt, wobei das Ende des Arrays durch eine Null gekennzeichnet wird.
Beispiel: char *text = "Hallo Welt!";
In diesem Fall ist text eine Pointer-Variable. Die
Deklarationssyntax kann man in etwa so lesen:
"Wenn ich auf die Variable text den Dereferenzierungsoperator '*'
loslasse, so ist das Ergebnis vom Typ char".
Die Schreibweise char *text[] = ... macht für eine einzelne
Zeichenkette keinen Sinn: Hier wird ein Array von Pointern auf
Zeichenketten angelegt.
Guck Dir mal folgendes Beispiel an, dann
wird evtl. einiges klarer:
#include<stdio.h>
int main(void) {
char *text = "Hallo Welt!";
char *tmp;
printf("Startadresse des Strings = %p\n", text);
for(tmp=text; *tmp; ++tmp)
printf("Addresse: %p - Zeichen: %c (0x%2x)\n", tmp, *tmp, *tmp);
return 0;
}
MfG
Andreas
Hello,
Der Typ 'char' bezeichnet genau ein Zeichen (normalerweise
ein Byte). Ein String wird in C als ein Array von 'char'-Zeichen
gehandhabt, wobei das Ende des Arrays durch eine Null gekennzeichnet wird.
Genaugenommen ist es nicht das Ende des Arrays, sondern das Ende des Strings, das durch eine \0 gekennzeichnet wird.
Das ist wichtig, wenn man nur ein Array bestimmter Größe für den String zur Verfügung hat.
char zeichenkettenname[101];
kann maximal 100 Zeichen aufnehmen, wenn es noch als "String" behandelt werden soll.
Da liegt wohl einer der Fehler, dass C das Maximum der Zeichen nicht ausreichend überprüft, so die abschließende \0 schnell mal überschreiben werden kann und eine spätere Ausgabe dann einfach weiter liest im Speicher bis zur nächsten \0.
Man kann "Strings" zur Sicherheit immer mit \0 initialisieren, bevor man sie neu beschreibt. Das hindert einen natürlich immer noch nicht daran, den zur Verfügung stehenden Platz zu überreizen ...
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo,
warum wird mal nach char* mal vor variablenname geschrieben?)
</archiv/2008/10/t177894/#m1172691>
Freundliche Grüße
Vinzenz
Hei,
habe mich auch mal an C rangetraut und mir sogar ein Buch gekauft...
ich blicke da auch nicht so wirklich durch und verstehe so manche sache nicht..
Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D
Hi dev/null!
habe mich auch mal an C rangetraut und mir sogar ein Buch gekauft...
ich blicke da auch nicht so wirklich durch und verstehe so manche sache nicht..
Ich auch. 1000 Seiten. Hat mir bei der Wache während meines Bundeswehrdienstes die Nacht versüßt.
Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D
Du bist doch nicht etwa ein C-Hasser?!
MfG H☼psel
Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D
Du bist doch nicht etwa ein C-Hasser?!
Juhu, Programmiersprachen-Flames!
Scheiße: C, C++, Java, PHP, Basic
Lol: Perl
Super: Python, Ruby, JavaScript, Smalltalk
Göttlich: Lisp
Achso: HTML-Programmierer dürfen nicht mitmachen!
Sup!
Göttlich: Lisp
Oh Scheisse, ein "Knight of the Lambda Calculus"! Rette sich, wer kann...
Gruesse,
Bio
Grundlage für Zitat #1252.
Oh Scheisse, ein "Knight of the Lambda Calculus"! Rette sich, wer kann...
Spüre den Klammer-Hammer!
((((((((((rumms))))))))))
((((((((((rumms))))))))))
((((((((((rumms))))))))))
((((((((((rumms))))))))))
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
Hi!
Oh Scheisse, ein "Knight of the Lambda Calculus"! Rette sich, wer kann...
Spüre den Klammer-Hammer!((((((((((rumms))))))))))
((((((((((rumms))))))))))
((((((((((rumms))))))))))
((((((((((rumms))))))))))
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
(rumms)
Manchmal macht Ihr mir Angst ...
Sup!
Ich versteck' mich dann mal auf der anderen Seite des Möbius-Bandes, und wenn Du mich aufspürst, stelle ich Dir das Halte-Problem...
Gruesse,
Bio
Ich versteck' mich dann mal auf der anderen Seite des Möbius-Bandes, und wenn Du mich aufspürst, stelle ich Dir das Halte-Problem...
Während ich das Ende des Bandes suche, zähle ich einfach, ich habe gehört, die Lösung für das Halte-Problem befindet sich am oberen Ende der natürlichen Zahlen. Halt nein, es versteckt sich zwischen der null und der nächstgrößeren reellen Zahl, so war's!
Sup!
Während ich das Ende des Bandes suche, zähle ich einfach, ich habe gehört, die Lösung für das Halte-Problem befindet sich am oberen Ende der natürlichen Zahlen. Halt nein, es versteckt sich zwischen der null und der nächstgrößeren reellen Zahl, so war's!
Dir kann man auch nichts vormachen... einigen wir uns auf Unentschieden!
Gruesse,
Bio
Hellihello
Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D
Genauso wahrscheinlich wie Du einen Grammatikduden nicht mehr anrühren würdest. Referenzierung ist ja ein zentraler Baustein bzw. vielleicht aucht DER zentrale Baustein bezüglich Variablen/Strukturen/Objekten in der Programmierung.
Dank und Gruß,
Moin,
das ist leider das prblem mit den kurzen internettutorials - da wird zwar erklärt was man machen muss um effekt "E" zu erzielen, aber Details....
Komplettes, deutsches Buch zu C: http://openbook.galileocomputing.de/c_von_a_bis_z/
Gruß
Stareagle
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
Hallo bleicher,
Dabei stieß ich auf folgendes Problem -
Variable und &Variable?
mit "&" adressiert man den speicher der variable? was soll der unterschied sein?
hast du schon mal versucht, in einem Adressbuch zu übernachten?
Gruß, Jürgen
Grundlage für Zitat #1254.