<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Johannuhrmann</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Johannuhrmann"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Johannuhrmann"/>
		<updated>2026-04-11T21:39:25Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7244</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7244"/>
				<updated>2006-05-07T19:14:02Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Kontrollanweisungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Hauptprogramm main=&lt;br /&gt;
Die erste Funktion, die nach dem Programmstart ausgeführt wird, ist immer die Funktion mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot;. Diese ist sozusagen das Hauptprogramm. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein int-Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; oft als oft auch als &amp;lt;/tt&amp;gt;void&amp;lt;/tt&amp;gt;-Funktion (ohne Rückgabewert) definiert wird. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen.&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{    /* der Block &amp;quot;main&amp;quot; beginnt */&lt;br /&gt;
   int zahl;&lt;br /&gt;
   &lt;br /&gt;
   {   /* ein Block beginnt */&lt;br /&gt;
       /* hier können Deklarationen und stehen Anweisungen stehen */&lt;br /&gt;
   }   /* der Block endet */&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
}    /* &amp;quot;main&amp;quot; endet */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  int zahlen[10];  /* zahlen[0] bis zahlen[9] !!! */&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i&amp;lt;10; i++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, i);&lt;br /&gt;
    scanf  (&amp;quot;%d&amp;quot;, &amp;amp; zahlen[i]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  for (i=0; i&amp;lt;10; i++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d ist: %d\n&amp;quot;, i, zahlen[i]);&lt;br /&gt;
     &lt;br /&gt;
  return 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
  {&lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert x: %d,  y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf  (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten Stelle im Speicher. Diese Stelle kann man in Erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Variable, in der eine Adresse gespeichert ist. Diese stellt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  int *zeiger;&lt;br /&gt;
 &lt;br /&gt;
  zeiger = &amp;amp;zahl;&lt;br /&gt;
  *zeiger = 12;&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;%d = %d&amp;quot;, zahl, *zeiger);&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;), anschliessend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels des Adress-Operators &amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;zeiger = &amp;amp;zahl&amp;lt;/tt&amp;gt;). &lt;br /&gt;
Jetzt möchten Sie der Speicherstelle, deren Adresse der Zeiger enthält, einen Wert zuweisen. Dazu verwendet man den &amp;quot;Inhalts-Operators&amp;quot; &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;*zeiger = 12&amp;lt;/tt&amp;gt;). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1, zahl2 = 12;&lt;br /&gt;
  char zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  zahl1 = 52;&lt;br /&gt;
  zeichen1 = zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;zahl1 = 52&amp;lt;/tt&amp;gt;: Hier wird der Variablen &amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt; der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable &amp;quot;wahr&amp;quot;, ansonsten ist sie &amp;quot;unwahr&amp;quot;. &lt;br /&gt;
 intVariable = !0;   /* entspricht &amp;quot;wahr&amp;quot;   */&lt;br /&gt;
 intVariable = 0;    /* entspricht &amp;quot;unwahr&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = zahl1 &amp;lt;= zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per &amp;lt;tt&amp;gt;#include&amp;lt;/tt&amp;gt; eingebunden wird.&lt;br /&gt;
 const float PI = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a[b]&amp;lt;/tt&amp;gt; || das (b+1)ste Element des Feldes a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgendes gilt es bei der Verwendung des Indexoperators zu beachten:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; muss ein [[C-Tutorial#Felder | Feld]] oder [[C-Tutorial#Zeiger | Zeiger]] sein&lt;br /&gt;
# &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; muss ein Integer sein oder ein Datentyp, der sich in einen int umwandeln läßt (z.B. char)&lt;br /&gt;
# Es wird nicht geprüft, ob der Index &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; im Feld &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; gültig ist!&lt;br /&gt;
# Der erste Index eines Feldes ist immer 0. Daher ''(b+1)stes Element'' in der Beschreibung&lt;br /&gt;
&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;    /* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;       /* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Der Cast-Operator selbst führt ''keine Konvertierung'' durch, sondern unterdrückt nur die Compilerwarnungen oder&lt;br /&gt;
-fehler, die bei einer &amp;quot;verdächtigen&amp;quot; Umwandlung passieren. Er kann also nicht benutzt werden, um einen Text in&lt;br /&gt;
eine Zahl oder umgekehrt zu wandeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  int main(int argc, char ** argv)&lt;br /&gt;
  {&lt;br /&gt;
        char text[] = &amp;quot;5.6&amp;quot;;&lt;br /&gt;
        int zahl = (int)text;&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, zahl);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgegeben wird weder 5 noch 6 sondern die Speicheradresse, an der der Text &amp;quot;5.6&amp;quot; beginnt. Der Cast-Operator&lt;br /&gt;
unterdrückt nur die Warnung, die auf den Fehler hinweisen will.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        /* WENN */&lt;br /&gt;
{                     /* DANN */&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
       ...&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     /* SONST */&lt;br /&gt;
       Anweisung3;&lt;br /&gt;
       Anweisung4;&lt;br /&gt;
       ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
switch(ausdruck) {&lt;br /&gt;
    case wert1:&lt;br /&gt;
        Anweisungen1...&lt;br /&gt;
    case wert2:&lt;br /&gt;
        Anweisungen2...&lt;br /&gt;
    case wert3:&lt;br /&gt;
        Anweisungen3...&lt;br /&gt;
    ...&lt;br /&gt;
    default:&lt;br /&gt;
        Anweisungen4...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;tt&amp;gt;ausdruck&amp;lt;/tt&amp;gt; muss eine Ganzzahl (int) ergeben und wird dann der Reihe nach mit den Werten, die hinter&lt;br /&gt;
den &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;-Anweisungen angegeben sind verglichen. Bei einer Übereinstimmung werden alle Befehle ab der&lt;br /&gt;
zutreffenden Case-Anweisung ausgeführt. Stimmt der &amp;lt;tt&amp;gt;ausdruck&amp;lt;/tt&amp;gt; mit keinem der Werte hinter &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;&lt;br /&gt;
überein, so wird der &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt;-Abschnitt ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Auch die Anweisungen der folgenden &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;- und des &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt;-Abschnitts werden ausgeführt, wenn die Anweisungen eines&lt;br /&gt;
&amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;-Abschnitts nicht mit dem Befehl &amp;lt;tt&amp;gt;break;&amp;lt;/tt&amp;gt; beendet werden!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es dürfen beliebig viele &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;-Abschnitte angegeben werden, pro Vergleichswert jedoch nur einer.&lt;br /&gt;
Der &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt;-Abschnitt ist optional, muss aber nach allen &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;-Abschnitten angegeben werden,&lt;br /&gt;
wenn er verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i=2;&lt;br /&gt;
do &lt;br /&gt;
{&lt;br /&gt;
    i = i*i;   /* i quadrieren */&lt;br /&gt;
    printf (&amp;quot;i = %d\n&amp;quot;, i);&lt;br /&gt;
}&lt;br /&gt;
while (i &amp;lt; 20);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; kleiner als 20 ist. Es werden also nacheinander die Werte 2, 4 und 16 ausgegeben.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Ist die Bedingung nicht mehr erfüllt, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block.&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung wahr ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr. In der Schleife wird die Summe ungerader Zahlen kleinergleich 10 berechnet. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int lauf;&lt;br /&gt;
int summe = 0;&lt;br /&gt;
&lt;br /&gt;
for (lauf = 1; lauf &amp;lt;= 10; lauf = lauf+2 ) &lt;br /&gt;
{&lt;br /&gt;
   summe = summe + lauf;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int lauf  = 1;                 /* Anfangswerte */&lt;br /&gt;
int summe = 0;&lt;br /&gt;
&lt;br /&gt;
while (lauf &amp;lt;= 10)             /* Bedingung */&lt;br /&gt;
{&lt;br /&gt;
   summe = summe + lauf;&lt;br /&gt;
   lauf += 2;                  /* Inkrement */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird &amp;lt;tt&amp;gt;summe&amp;lt;/tt&amp;gt; in jedem Schleifendurchlauf um die Laufvariable &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; erhöht. Da &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; nacheinander die ungeraden Werte von 1 bis 10 hat, ist in &amp;lt;tt&amp;gt;summe&amp;lt;/tt&amp;gt; nach der Schleife die Summe der ungeraden Zahlen von 1 bis kleinergleich 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;lt;tt&amp;gt;lauf = 1&amp;lt;/tt&amp;gt; bedeutet, dass der Variablen &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; vor dem ersten Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
&amp;lt;tt&amp;gt;lauf &amp;lt;= 10&amp;lt;/tt&amp;gt; ist die Schleifenbedingung; ist sie nicht erfüllt, wird die Schleife beendet. &lt;br /&gt;
&amp;lt;tt&amp;gt;lauf = lauf+2&amp;lt;/tt&amp;gt; bedeutet, dass &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; nach jedem Durchlauf um&amp;amp;nbsp;2 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Die dazu notwendige Funktione heisst &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; (das '&amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt;' ist kein Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf das Standard-AUsgabegerät aus, in der Regel also auf den Bildschirm. Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, &amp;lt;/tt&amp;gt;char&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;...) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    int zahl1 = 12;&lt;br /&gt;
    char zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen 'zahl1' ist: %d \n&amp;quot;, zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen 'zeichen1' ist: %c \n&amp;quot;, zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen 'zeichen1' ist: %d \n&amp;quot;, zeichen1);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;-Befehl gibt Text aus. Das Zeichen am Ende (&amp;lt;tt&amp;gt;\n&amp;lt;/tt&amp;gt;) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der zweite &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;-Befehl gibt auch Text aus, am Ende befindet sich wieder das &amp;lt;tt&amp;gt;\n&amp;lt;/tt&amp;gt;, um einen Zeilenvorschub zu erreichen. Das &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; wird vom Compiler durch den ersten Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; also durch den Wert der Variablen &amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt; ersetzt. Das &amp;lt;tt&amp;gt;d&amp;lt;/tt&amp;gt; im &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der dritten Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet &amp;lt;tt&amp;gt;%c&amp;lt;/tt&amp;gt; &amp;quot;char&amp;quot; (Zeichen). Es wird also &amp;lt;tt&amp;gt;%c&amp;lt;/tt&amp;gt; durch ein &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt; ersetzt, denn die Variable &amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt; wird als Character interpretiert. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe interpretiert den Inhalt von &amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt; als Zahl, und gibt dager den ASCII-Wert von &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt;, also 65 aus. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer  Variablen! &lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Die wichtigste Funktion ist &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  zahl1;&lt;br /&gt;
char zeichen1;&lt;br /&gt;
&lt;br /&gt;
printf (&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf  (&amp;quot;%d&amp;quot;, &amp;amp;zahl1);&lt;br /&gt;
printf (&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf  (&amp;quot;%c&amp;quot;, &amp;amp;zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Dieser Wert wird in &amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt; abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt; bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2 (int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl = param1 * param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1, ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf  (&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  &lt;br /&gt;
  ergebnis = hoch2 (zahl1);&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1, ergebnis);&lt;br /&gt;
  printf (&amp;quot;5 hoch 2 = %d\n&amp;quot;, hoch2(5));&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme sind in Standard-C nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Danach folgt der Name der Funktion (case-sensitiv!). Dann kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden und mittels Komma voneinander getrennt werden.&lt;br /&gt;
Im Block der Funktion können lokale Variablen definiert werden und alle Anweisungen ausgeführt werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an&lt;br /&gt;
 variable = Funktion (Parameter);&lt;br /&gt;
 Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' &amp;lt;tt&amp;gt;void Name (Parameterliste)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion mit dem speziellen  Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, der kennzeichnet, daß die Funktion keinen Wert zurückliefert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; angegeben. &lt;br /&gt;
Einer Variablen kann daher nicht der Rückgabewert einer &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;-Funktion zugewiesen werden, da diese garkeinen Rückgabewert liefert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben (int param1)&lt;br /&gt;
{&lt;br /&gt;
  printf (&amp;quot;Der Wert der Variablen ist: %d\n&amp;quot;, param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl1 = 4;&lt;br /&gt;
   &lt;br /&gt;
   ausgeben (23);&lt;br /&gt;
   ausgeben (zahl1);&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;&amp;lt;tt&amp;gt;ausgeben(23)&amp;lt;/tt&amp;gt;&amp;quot; wird die Prozedur &amp;quot;&amp;lt;tt&amp;gt;ausgeben&amp;lt;/tt&amp;gt;&amp;quot; mit dem Parameter &amp;lt;tt&amp;gt;23&amp;lt;/tt&amp;gt; aufgerufen. &amp;lt;tt&amp;gt;param1&amp;lt;/tt&amp;gt; hat also den Wert &amp;lt;tt&amp;gt;23&amp;lt;/tt&amp;gt;. Die einzige Anweisung innerhalb der Prozedur ist &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;, was nun ausgeführt wird. &lt;br /&gt;
Der zweite Aufruf von &amp;lt;tt&amp;gt;ausgeben&amp;lt;/tt&amp;gt; erfolgt mit dem Parameter &amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt;, also wird &amp;lt;tt&amp;gt;param1&amp;lt;/tt&amp;gt; der Wert 4 zugewiesen. Dieser wird nun wieder mittels &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; ausgeben. &lt;br /&gt;
&lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, haben statt einer Parameterliste nur &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; stehen. Das &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; bedeutet &amp;quot;die Funktion erhält keine Parameter&amp;quot;. &amp;quot;&amp;lt;tt&amp;gt;void main (void)&amp;lt;/tt&amp;gt;&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, müssen Sie beim Aufruf trotzdem die Klammern angeben. Beispiel für eine parameterlose Funktion &amp;lt;tt&amp;gt;foo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 foo();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des ersten Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Deklaration davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. &amp;quot;&amp;lt;tt&amp;gt;void ausgeben (int zahl)&amp;lt;/tt&amp;gt;&amp;quot;), fügen einen Strichpunkt&amp;amp;nbsp;&amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;an und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang der Quelldatei oder in einer Header-Datei, die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben (int zahl);  /* Der Prototyp */&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   ausgeben (12);&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben (int zahl)   /* Die eigentliche Prozedur */&lt;br /&gt;
{&lt;br /&gt;
  printf (&amp;quot;Ausgabe: %d\n&amp;quot;, zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameterübergabe==&lt;br /&gt;
&lt;br /&gt;
Alle Werte, die an Prozeduren und Funktionen übergeben werden, werden grundsätzlich '''kopiert'''.&lt;br /&gt;
Das hat folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
# Änderungen an einem Parameter in einer Funktion erscheinen ''nicht'' beim Aufrufer!&lt;br /&gt;
# Möchte man, dass eine Funktion einen Wert trotzdem dauerhaft ändern soll, so muss die Adresse des Wertes via [[#Zeiger | Zeiger]] übergeben werden.&lt;br /&gt;
# Werden [[#Strukturen | Strukturen]] übergeben, so wird von ihnen eine Kopie erstellt, was bei großen Strukturen viel Zeit und Arbeitsspeicher kostet. Deshalb wird häufig nur die Adresse von Strukturen übergeben, da die Adresse viel schneller und platzsparender als die Struktur selbst kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void erhoehe (int x)&lt;br /&gt;
{&lt;br /&gt;
   x = x + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int a = 0;&lt;br /&gt;
   erhoehe(a);&lt;br /&gt;
   /* a ist immer noch 0 */&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; wird eine Kopie des Wertes von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; (im Beispiel also 0) erstellt und der Prozedur als Parameter x übergeben. Dass dann die Prozedur &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; die Kopie verändert, hat keine Auswirkung auf das Original &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; im Hauptprogramm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void erhoehe (int *x)&lt;br /&gt;
{&lt;br /&gt;
   /* erhöhe den Wert an der Adresse x um eins */&lt;br /&gt;
   *x = *x + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   int a = 0;&lt;br /&gt;
   erhoehe (&amp;amp;a);&lt;br /&gt;
   /* a ist jetzt 1 */&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird im Hauptprogramm mittels [[#Adress-Operator und Dereferenzierung|Adress-Operator]] &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; die Speicheradresse von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; bestimmt. Dann wird eine ''Kopie der Adresse'' an das Unterprogramm &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; übergeben. Jetzt kennt das Unterprogramm die&lt;br /&gt;
Adresse des Originals &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und kann direkt mit dem Operator &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf den Wert an dieser Adresse zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Besonderheit bei Feldern'''&lt;br /&gt;
&lt;br /&gt;
Bei der Übergabe von [[#Felder|Feldern]] gibt es eine Besonderheit. Schreibt man nämlich den Namen eines&lt;br /&gt;
Feldes, so ist das nichts anderes als die '''Speicheradresse des ersten Elements'''.&lt;br /&gt;
Bei der Übergabe eines Feldes wird also eine Kopie der Startadresse übergeben. Somit kann das Unterprogramm auf&lt;br /&gt;
den Originaldaten arbeiten und diese verändern.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void erhoehe (int x[])&lt;br /&gt;
{&lt;br /&gt;
   x[0] = x[0] + 1;&lt;br /&gt;
   x[1] = x[1] + 3;&lt;br /&gt;
   x[2] = x[2] + 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
  int a[] = {10, 20, 30};&lt;br /&gt;
  &lt;br /&gt;
  erhoehe (a);&lt;br /&gt;
  /* a hat jetzt folgenden Inhalt: 11, 23, 35 */&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dass die Übergabe einer Adresse erfolgt, sieht man an folgendem Beispiel, das von der Funktionsweise '''absolut identisch''' mit dem vorhergehenden ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Bei Parametern gibt es keinen Unterschied zwischen Zeiger und Feld */&lt;br /&gt;
   void erhoehe (int *x)&lt;br /&gt;
{&lt;br /&gt;
   x[0] = x[0] + 1;&lt;br /&gt;
   x[1] = x[1] + 3;&lt;br /&gt;
   x[2] = x[2] + 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
  int a[] = {10, 20, 30};&lt;br /&gt;
  &lt;br /&gt;
  erhoehe (a);&lt;br /&gt;
&lt;br /&gt;
  /* a hat jetzt folgenden Inhalt: 11, 23, 35 */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
Die Länge des Feldes wird nicht automatisch übergeben. Dafür ist ggf. ein zusätzlicher Parameter notwendig.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21], eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy (stri1, &amp;quot;hallo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Der 1. String: %s\n&amp;quot;, stri1);&lt;br /&gt;
  printf (&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf  (&amp;quot;%s&amp;quot;, eingabe);&lt;br /&gt;
  strcpy (stri1, eingabe);&lt;br /&gt;
  printf (&amp;quot;\n%s = %s&amp;quot;, stri1, eingabe);&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; bei &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt; angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden zwei gleich große Strings definiert: &amp;lt;tt&amp;gt;stri1&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;eingabe&amp;lt;/tt&amp;gt;, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
In &amp;lt;tt&amp;gt;stri1&amp;lt;/tt&amp;gt; wird die Zeichenkette &amp;lt;tt&amp;gt;&amp;quot;hallo&amp;quot;&amp;lt;/tt&amp;gt; hineinkopiert. Das 0-Zeichen am Ende wird automatisch angefügt. &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt &amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt; ins Spiel. Es hat die gleiche Aufgabe wie &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;%c&amp;lt;/tt&amp;gt;, nur für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable &amp;lt;tt&amp;gt;stri1&amp;lt;/tt&amp;gt; kopiert. &lt;br /&gt;
Beide Strings, die ja nun die gleiche Zeichenkette enthalten, werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion &amp;lt;tt&amp;gt;strlen&amp;lt;/tt&amp;gt;, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;Das ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  &lt;br /&gt;
  strcpy (stri, &amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf (&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen (stri));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels &amp;lt;tt&amp;gt;stri[0]&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;stri[1]&amp;lt;/tt&amp;gt;, etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe (int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger = *zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf  (&amp;quot;%d&amp;quot;, &amp;amp;zahl);&lt;br /&gt;
  erhoehe (&amp;amp;zahl);&lt;br /&gt;
  printf (&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;, zahl);&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
* [[Benutzer:SprinterSB|SprinterSB]]&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7110</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7110"/>
				<updated>2006-04-30T18:58:28Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Parameterübergabe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a[b]&amp;lt;/tt&amp;gt; || das (b+1)ste Element des Feldes a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgendes gilt es bei der Verwendung des Indexoperators zu beachten:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; muss ein [[C-Tutorial#Felder | Feld]] oder [[C-Tutorial#Zeiger | Zeiger]] sein&lt;br /&gt;
# &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; muss ein Integer sein oder ein Datentyp, der sich in einen int umwandeln läßt (z.B. char)&lt;br /&gt;
# Es wird nicht geprüft, ob der Index &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; im Feld &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; gültig ist!&lt;br /&gt;
# Der erste Index eines Feldes ist immer 0. Daher ''(b+1)stes Element'' in der Beschreibung&lt;br /&gt;
&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Der Cast-Operator selbst führt ''keine Konvertierung'' durch, sondern unterdrückt nur die Compilerwarnungen oder&lt;br /&gt;
-fehler, die bei einer &amp;quot;verdächtigen&amp;quot; Umwandlung passieren. Er kann also nicht benutzt werden, um einen Text in&lt;br /&gt;
eine Zahl oder umgekehrt zu wandeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  int main(int argc, char ** argv)&lt;br /&gt;
  {&lt;br /&gt;
        char text[] = &amp;quot;5.6&amp;quot;;&lt;br /&gt;
        int zahl = (int)text;&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, zahl);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgegeben wird weder 5 noch 6 sondern die Speicheradresse, an der der Text &amp;quot;5.6&amp;quot; beginnt. Der Cast-Operator&lt;br /&gt;
unterdrückt nur die Warnung, die auf den Fehler hinweisen will.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameterübergabe==&lt;br /&gt;
&lt;br /&gt;
Alle Werte, die an Prozeduren und Funktionen übergeben werden, werden grundsätzlich '''kopiert'''.&lt;br /&gt;
Das hat folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
# Änderungen an einem Parameter in einer Funktion erscheinen ''nicht'' beim Aufrufer!&lt;br /&gt;
# Möchte man, dass eine Funktion einen Wert trotzdem dauerhaft ändern soll, so muss die Adresse des Wertes via [[C-Tutorial#Zeiger | Zeiger]] übergeben werden.&lt;br /&gt;
# Werden [[C-Tutorial#Strukturen | Strukturen]] übergeben, so wird von ihnen eine Kopie erstellt, was bei großen Strukturen viel Zeit und Arbeitsspeicher kostet. Deshalb wird häufig nur die Adresse von Strukturen übergeben, da die Adresse viel schneller und platzsparender als die Struktur selbst kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int x)&lt;br /&gt;
   {&lt;br /&gt;
      x = x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(a);&lt;br /&gt;
      /* a ist immer noch 0 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; wird eine Kopie des Wertes von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; (im Beispiel also 0) erstellt und der Prozedur als Parameter x übergeben. Dass dann die Prozedur &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; die Kopie verändert, hat keine Auswirkung auf das Original &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; im Hauptprogramm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int *x)&lt;br /&gt;
   {&lt;br /&gt;
      /* erhöhe den Wert an der Adresse x um eins */&lt;br /&gt;
      *x = *x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(&amp;amp;a);&lt;br /&gt;
      /* a ist jetzt 1 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird im Hauptprogramm mittels [[C-Tutorial#Adress-Operator_und_Dereferenzierung | Adress-Operator]] &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; die Speicheradresse von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; bestimmt. Dann wird eine ''Kopie der Adresse'' an das Unterprogramm &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; übergeben. Jetzt kennt das Unterprogramm die&lt;br /&gt;
Adresse des Originals &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und kann direkt mit dem Operator &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf den Wert an dieser Adresse zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Besonderheit bei Feldern'''&lt;br /&gt;
&lt;br /&gt;
Bei der Übergabe von [[C-Tutorial#Felder | Feldern]] gibt es eine Besonderheit. Schreibt man nämlich den Namen eines&lt;br /&gt;
Feldes, so ist das nichts anderes als die '''Speicheradresse des ersten Elements'''.&lt;br /&gt;
Bei der Übergabe eines Feldes wird also eine Kopie der Startadresse übergeben. Somit kann das Unterprogramm auf&lt;br /&gt;
den Originaldaten arbeiten und diese verändern.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  void erhoehe(int x[])&lt;br /&gt;
  {&lt;br /&gt;
     x[0] = x[0] + 1;&lt;br /&gt;
     x[1] = x[1] + 3;&lt;br /&gt;
     x[2] = x[2] + 5;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
    int a[] = {10, 20, 30};&lt;br /&gt;
    erhoehe(a);&lt;br /&gt;
&lt;br /&gt;
    /* a hat jetzt folgenden Inhalt: 11, 23, 35 */&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dass die Übergabe einer Adresse erfolgt, sieht man an folgendem Beispiel, das von der Funktionsweise&lt;br /&gt;
'''absolut identisch''' mit dem vorhergehenden ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  /* Bei Parametern gibt es keinen Unterschied zwischen Zeiger und Feld */&lt;br /&gt;
  void erhoehe(int *x)&lt;br /&gt;
  {&lt;br /&gt;
     x[0] = x[0] + 1;&lt;br /&gt;
     x[1] = x[1] + 3;&lt;br /&gt;
     x[2] = x[2] + 5;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
    int a[] = {10, 20, 30};&lt;br /&gt;
    erhoehe(a);&lt;br /&gt;
&lt;br /&gt;
    /* a hat jetzt folgenden Inhalt: 11, 23, 35 */&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
Die Länge des Feldes wird nicht automatisch übergeben. Dafür ist ggf. ein zusätzlicher Parameter notwendig.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7108</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7108"/>
				<updated>2006-04-30T18:30:22Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Index-Operator bei Arrays */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a[b]&amp;lt;/tt&amp;gt; || das (b+1)ste Element des Feldes a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgendes gilt es bei der Verwendung des Indexoperators zu beachten:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; muss ein [[C-Tutorial#Felder | Feld]] oder [[C-Tutorial#Zeiger | Zeiger]] sein&lt;br /&gt;
# &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; muss ein Integer sein oder ein Datentyp, der sich in einen int umwandeln läßt (z.B. char)&lt;br /&gt;
# Es wird nicht geprüft, ob der Index &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; im Feld &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; gültig ist!&lt;br /&gt;
# Der erste Index eines Feldes ist immer 0. Daher ''(b+1)stes Element'' in der Beschreibung&lt;br /&gt;
&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Der Cast-Operator selbst führt ''keine Konvertierung'' durch, sondern unterdrückt nur die Compilerwarnungen oder&lt;br /&gt;
-fehler, die bei einer &amp;quot;verdächtigen&amp;quot; Umwandlung passieren. Er kann also nicht benutzt werden, um einen Text in&lt;br /&gt;
eine Zahl oder umgekehrt zu wandeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  int main(int argc, char ** argv)&lt;br /&gt;
  {&lt;br /&gt;
        char text[] = &amp;quot;5.6&amp;quot;;&lt;br /&gt;
        int zahl = (int)text;&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, zahl);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgegeben wird weder 5 noch 6 sondern die Speicheradresse, an der der Text &amp;quot;5.6&amp;quot; beginnt. Der Cast-Operator&lt;br /&gt;
unterdrückt nur die Warnung, die auf den Fehler hinweisen will.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameterübergabe==&lt;br /&gt;
&lt;br /&gt;
Alle Werte, die an Prozeduren und Funktionen übergeben werden, werden grundsätzlich '''kopiert'''.&lt;br /&gt;
Das hat folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
# Änderungen an einem Parameter in einer Funktion erscheinen ''nicht'' beim Aufrufer!&lt;br /&gt;
# Möchte man, dass eine Funktion einen Wert trotzdem dauerhaft ändern soll, so muss die Adresse des Wertes via [[C-Tutorial#Zeiger | Zeiger]] übergeben werden.&lt;br /&gt;
# Werden [[C-Tutorial#Strukturen | Strukturen]] übergeben, so wird von ihnen eine Kopie erstellt, was bei großen Strukturen viel Zeit und Arbeitsspeicher kostet. Deshalb wird häufig nur die Adresse von Strukturen übergeben, da die Adresse viel schneller und platzsparender als die Struktur selbst kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int x)&lt;br /&gt;
   {&lt;br /&gt;
      x = x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(a);&lt;br /&gt;
      /* a ist immer noch 0 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; wird eine Kopie des Wertes von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; (im Beispiel also 0) erstellt und der Prozedur als Parameter x übergeben. Dass dann die Prozedur &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; die Kopie verändert, hat keine Auswirkung auf das Original &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; im Hauptprogramm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int *x)&lt;br /&gt;
   {&lt;br /&gt;
      /* erhöhe den Wert an der Adresse x um eins */&lt;br /&gt;
      *x = *x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(&amp;amp;a);&lt;br /&gt;
      /* a ist jetzt 1 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird im Hauptprogramm mittels [[C-Tutorial#Adress-Operator_und_Dereferenzierung | Adress-Operator]] &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; die Speicheradresse von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; bestimmt. Dann wird eine ''Kopie der Adresse'' an das Unterprogramm &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; übergeben. Jetzt kennt das Unterprogramm die&lt;br /&gt;
Adresse des Originals &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und kann direkt mit dem Operator &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf den Wert an dieser Adresse zugreifen.&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7061</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7061"/>
				<updated>2006-04-30T09:22:36Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Cast-Operator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Der Cast-Operator selbst führt ''keine Konvertierung'' durch, sondern unterdrückt nur die Compilerwarnungen oder&lt;br /&gt;
-fehler, die bei einer &amp;quot;verdächtigen&amp;quot; Umwandlung passieren. Er kann also nicht benutzt werden, um einen Text in&lt;br /&gt;
eine Zahl oder umgekehrt zu wandeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  int main(int argc, char ** argv)&lt;br /&gt;
  {&lt;br /&gt;
        char text[] = &amp;quot;5.6&amp;quot;;&lt;br /&gt;
        int zahl = (int)text;&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, zahl);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgegeben wird weder 5 noch 6 sondern die Speicheradresse, an der der Text &amp;quot;5.6&amp;quot; beginnt. Der Cast-Operator&lt;br /&gt;
unterdrückt nur die Warnung, die auf den Fehler hinweisen will.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameterübergabe==&lt;br /&gt;
&lt;br /&gt;
Alle Werte, die an Prozeduren und Funktionen übergeben werden, werden grundsätzlich '''kopiert'''.&lt;br /&gt;
Das hat folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
# Änderungen an einem Parameter in einer Funktion erscheinen ''nicht'' beim Aufrufer!&lt;br /&gt;
# Möchte man, dass eine Funktion einen Wert trotzdem dauerhaft ändern soll, so muss die Adresse des Wertes via [[C-Tutorial#Zeiger | Zeiger]] übergeben werden.&lt;br /&gt;
# Werden [[C-Tutorial#Strukturen | Strukturen]] übergeben, so wird von ihnen eine Kopie erstellt, was bei großen Strukturen viel Zeit und Arbeitsspeicher kostet. Deshalb wird häufig nur die Adresse von Strukturen übergeben, da die Adresse viel schneller und platzsparender als die Struktur selbst kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int x)&lt;br /&gt;
   {&lt;br /&gt;
      x = x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(a);&lt;br /&gt;
      /* a ist immer noch 0 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; wird eine Kopie des Wertes von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; (im Beispiel also 0) erstellt und der Prozedur als Parameter x übergeben. Dass dann die Prozedur &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; die Kopie verändert, hat keine Auswirkung auf das Original &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; im Hauptprogramm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int *x)&lt;br /&gt;
   {&lt;br /&gt;
      /* erhöhe den Wert an der Adresse x um eins */&lt;br /&gt;
      *x = *x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(&amp;amp;a);&lt;br /&gt;
      /* a ist jetzt 1 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird im Hauptprogramm mittels [[C-Tutorial#Adress-Operator_und_Dereferenzierung | Adress-Operator]] &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; die Speicheradresse von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; bestimmt. Dann wird eine ''Kopie der Adresse'' an das Unterprogramm &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; übergeben. Jetzt kennt das Unterprogramm die&lt;br /&gt;
Adresse des Originals &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und kann direkt mit dem Operator &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf den Wert an dieser Adresse zugreifen.&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7060</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7060"/>
				<updated>2006-04-30T08:41:42Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Parameterübergabe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameterübergabe==&lt;br /&gt;
&lt;br /&gt;
Alle Werte, die an Prozeduren und Funktionen übergeben werden, werden grundsätzlich '''kopiert'''.&lt;br /&gt;
Das hat folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
# Änderungen an einem Parameter in einer Funktion erscheinen ''nicht'' beim Aufrufer!&lt;br /&gt;
# Möchte man, dass eine Funktion einen Wert trotzdem dauerhaft ändern soll, so muss die Adresse des Wertes via [[C-Tutorial#Zeiger | Zeiger]] übergeben werden.&lt;br /&gt;
# Werden [[C-Tutorial#Strukturen | Strukturen]] übergeben, so wird von ihnen eine Kopie erstellt, was bei großen Strukturen viel Zeit und Arbeitsspeicher kostet. Deshalb wird häufig nur die Adresse von Strukturen übergeben, da die Adresse viel schneller und platzsparender als die Struktur selbst kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int x)&lt;br /&gt;
   {&lt;br /&gt;
      x = x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(a);&lt;br /&gt;
      /* a ist immer noch 0 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; wird eine Kopie des Wertes von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; (im Beispiel also 0) erstellt und der Prozedur als Parameter x übergeben. Dass dann die Prozedur &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; die Kopie verändert, hat keine Auswirkung auf das Original &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; im Hauptprogramm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int *x)&lt;br /&gt;
   {&lt;br /&gt;
      /* erhöhe den Wert an der Adresse x um eins */&lt;br /&gt;
      *x = *x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(&amp;amp;a);&lt;br /&gt;
      /* a ist jetzt 1 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird im Hauptprogramm mittels [[C-Tutorial#Adress-Operator_und_Dereferenzierung | Adress-Operator]] &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; die Speicheradresse von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; bestimmt. Dann wird eine ''Kopie der Adresse'' an das Unterprogramm &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; übergeben. Jetzt kennt das Unterprogramm die&lt;br /&gt;
Adresse des Originals &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und kann direkt mit dem Operator &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf den Wert an dieser Adresse zugreifen.&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7059</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7059"/>
				<updated>2006-04-30T08:39:54Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: Parameterübergabe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameterübergabe==&lt;br /&gt;
&lt;br /&gt;
Alle Werte, die an Prozeduren und Funktionen übergeben werden, werden grundsätzlich '''kopiert'''.&lt;br /&gt;
Das hat folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
# Änderungen an einem Parameter in einer Funktion erscheinen ''nicht'' beim Aufrufer!&lt;br /&gt;
# Möchte man, dass eine Funktion einen Wert trotzdem dauerhaft ändern soll, so muss die Adresse des Wertes via [[C-Tutorial#Zeiger | Zeiger]] übergeben werden.&lt;br /&gt;
# Werden [[C-Tutorial#Strukturen | Strukturen]] übergeben, so wird von ihnen eine Kopie erstellt, was bei großen Strukturen viel Zeit und Arbeitsspeicher kostet. Deshalb wird häufig nur die Adresse von Strukturen übergeben, da die Adresse viel schneller und platzsparender als die Struktur selbst kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int x)&lt;br /&gt;
   {&lt;br /&gt;
      x = x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(a);&lt;br /&gt;
      /* a ist immer noch 0 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; wird eine Kopie des Wertes von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; (im Beispiel also 0) erstellt und der Prozedur als Parameter x übergeben. Dass dann die Prozedur &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; die Kopie verändert, hat keine Auswirkung auf das Original &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; im Hauptprogramm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   void erhoehe(int *x)&lt;br /&gt;
   {&lt;br /&gt;
      /* erhöhe den Wert an der Adresse x um eins */&lt;br /&gt;
      *x = *x + 1;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void main(void)&lt;br /&gt;
   {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      erhoehe(&amp;amp;a);&lt;br /&gt;
      /* a ist jetzt 1 */&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird im Hauptprogramm mittels [[C-Tutorial#Adress-Operator_und_Dereferenzierung | Adress-Operator]] &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; die Speicheradresse von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; bestimmt. Dann wird eine ''Kopie der Adresse'' an das Unterprogramm &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; übergeben. Jetzt kennt das Unterprogramm die&lt;br /&gt;
Adresse des Originals &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und kann direkt mit dem Operator &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf den Wert an der dieser Adresse zugreifen.&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7058</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7058"/>
				<updated>2006-04-30T07:58:04Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Komponenten-Auswahl bei Structs und Unions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7057</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7057"/>
				<updated>2006-04-30T07:54:37Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Adress-Operator und Dereferenzierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7044</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7044"/>
				<updated>2006-04-28T14:26:12Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Adress-Operator und Dereferenzierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse einer Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7043</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7043"/>
				<updated>2006-04-28T05:54:39Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Adress-Operator und Dereferenzierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int x = 5;	/* x ist eine Integervariable und hat den Wert 5 */&lt;br /&gt;
&lt;br /&gt;
  /* z ist ein Zeiger auf eine Integervariable und enthält somit&lt;br /&gt;
     die Speicheradresse eine Integervariablen&lt;br /&gt;
  */&lt;br /&gt;
  int *z;       &lt;br /&gt;
&lt;br /&gt;
  /* Verwendung des Adressoperators... */&lt;br /&gt;
  z = &amp;amp;x;	/* weise z die Speicheradresse von x zu */&lt;br /&gt;
&lt;br /&gt;
  /* Verwendung der Dereferenzierung */&lt;br /&gt;
  /* erhöhe den Wert, der bei Adresse z steht um eins */&lt;br /&gt;
  *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
  /* da z auf x zeigt, hat auch x jetzt den Wert 6 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff&lt;br /&gt;
auf ein Element eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch&lt;br /&gt;
auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu&lt;br /&gt;
einer Änderung '''irgendeiner''' Speicherstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   int *z; /* z ist ein Zeiger auf einen Integer */&lt;br /&gt;
&lt;br /&gt;
   /* An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.&lt;br /&gt;
      z enthält irgendeine(!) Adresse&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
   /* &amp;quot;Erhöhe einen Integer irgendwo im Speicher um 1&amp;quot; -&amp;gt; CRASH */&lt;br /&gt;
   *z = *z + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler (z.B. gcc) erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:C-Tutorial&amp;diff=7042</id>
		<title>Diskussion:C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:C-Tutorial&amp;diff=7042"/>
				<updated>2006-04-28T05:12:50Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* volatile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Habt ihr ihr auch texte aus Buchern oder Tutorials hier reingesetzt?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ich würde die Kapitelnummern weglassen. Wenn Du es mit den Gleichheitszeichen strukturierst reicht das völlig und ist übersichtlicher! &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 22:49, 16. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
== einige Anmerkungen ==&lt;br /&gt;
&lt;br /&gt;
* main ist ''nicht'' vom Typ void, sondern liefert int. Einige Compiler unterstützen main auch als void, dazu müssen aber spezielle Schalter angegeben werden.&lt;br /&gt;
* C unterscheidet zwischen Groß- und Kleinschreibung bei allen Bezeichnern.&lt;br /&gt;
* Quellen werden besser lesbar, wenn man Leerzeichen benutzt, z.b. nach ',' in Argumentlisten oder Deklarationen&lt;br /&gt;
* Quellen werden besser lesbar, wenn man Code-Konventionen verwendet, z.b. Makro-Namen groß zu schreiben: DAS_IST_EIN_MAKRO, Funktionsnamen klein: &amp;lt;tt&amp;gt;eine_funktion()&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;eineFunktion()&amp;lt;/tt&amp;gt; und selber definierte Typen klein mit nachgestelltem _t: &amp;lt;tt&amp;gt;mytype_t&amp;lt;/tt&amp;gt;&lt;br /&gt;
* '''an vielen Stellen ist falscher Code''', der kein C ist! Bevor man so was in ein Tutorial stellt, sollte man sich im klaren sein, was C ist und was nicht. Etwa das Beispiel zu PERSON ist komplett inkorrekt und verwirrt mehr als er erhellt!&lt;br /&gt;
* An vielen Stellen werden Begriffe nicht korrekt benutzt, etwa &amp;quot;Deklaration&amp;quot; anstatt &amp;quot;Definition&amp;quot; oder umgekehrt. Dudem sollte geklärt sein, was der Unterschied überhaup ''ist''.&lt;br /&gt;
* In C gibt es '''kein Typ boolean''', bool o.ä. C ist kein Pascal. Ebenfalls nicht definiert sind TRUE und FALSE. Boolsche Variablen in C werden durch int abgebildet -- zumindest in Standard C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Tutorial ist noch nicht perfekt. Jeder kann natürlich Korrekturen und Verbesserungen einbringen, einfach ändern.&lt;br /&gt;
--[[Benutzer:Bernd|Bernd]] 12:02, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder hat meinen ganzen Respekt, wenn er sich die Arbeit macht und solche ausführlichen Artikel schreibt.&lt;br /&gt;
Bitte das also als positive Kritik zu sehen. &lt;br /&gt;
Aaaaaber: Grad bei einem Tutorial MÜSSEN auch die Details stimmen !! Und jeder Autor trägt da auch Verantwortung !  &lt;br /&gt;
Bitte, die Autoren mögen den Artikel nochmal gaaaanz genau durcharbeiten. Es sind sehr viele Einzelheiten, die den Laien auf's Glatteis führen und den Wissenden die Nase rümpfen lassen. &lt;br /&gt;
*eine variable ist eine variable, das hat mit RAM prinzipiell nix zu tun &lt;br /&gt;
*Wieviele Daten passen in eine Variable ?  (immer genau ein Datum)&lt;br /&gt;
*die Bitanzahl von int ist etwas differenzierter als dargestellt, ganz zu schweigen von &amp;quot;unsigned&amp;quot; Varianten&lt;br /&gt;
*In der Mitte von &amp;quot;for&amp;quot; steht keine Abbruchbedingung, sondern eine Laufbedingung&lt;br /&gt;
*&amp;quot;case sensitiv&amp;quot; heißt nicht, man muß kleinschreiben, sondern man muß drauf aufpassen&lt;br /&gt;
Bitte keine Codebeispiele, wo der Compiler sofort auszuckt. Das muß man ausprobieren oder nochmal lesen, bevor man einen Einsteiger frustrierten in die Wüste schickt.&lt;br /&gt;
--PicNick 12:57, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ihr könnt gerne alles verbessern, aber bitte keine Fehler einbauen. Ihr habt das Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
intVariable = 123;  //entspricht in Pascal:  boolVariable:=true;&lt;br /&gt;
intVariable = 1;    //entspricht in Pascal:  boolVariable:=true;&lt;br /&gt;
intVariable = 0;    //entspricht in Pascal:  boolVariable:=false;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vermutlich falsch verstanden. ''intVariable'' ist ein Variablenname, daher darf es nicht ''int Variable'' lauten.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;quot;aber bitte keine Fehler einbauen.&amp;quot;  Was ist mit &amp;quot;const&amp;quot; ? bleibt das so ? Es ist blöd, wenn da dutzende Leute immer gleichzeitig den selben Artikel beflastern müssen. --PicNick 12:24, 21. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ich bin erst mal fertig. Ihr könnt den Text also ergänzen / ändern wenn ihr wollt. Allerdings folgende Ergänzung von euch, &amp;quot;long long&amp;quot; bei den Typen, ist verwirrend. Man spricht von Double, &amp;quot;long long&amp;quot; ist kein echter Begriff aus der C Fachliteratur.&lt;br /&gt;
: double ist eine Gleitpunktvariable während long long eine 8byte Ganzzahl ist. long long ist C99-Standard. veraltete Fachliteratur? :-) --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:08, 25. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
evtl sollte man sämtliche Compiler-, Betriebssystem- bzw. Programmspezifischen Sachen entfernen bzw umschreiben; zB gibt es unter linux (mit gcc als Standardcompiler) keine conio.h; Und Erklärungen wie &amp;quot;Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&amp;quot; sind für Menschen die nicht die selbe IDE wie der Schreiber nutzen eher verwirrend als nützlich. Allerdings müsste man sich darüber klar werden wie das ganze aussehen soll, ich würde nämlich einfach alles, was nicht überall funktioniert, ganz einfach rauskicken; vielleicht tuts aber auch ein Hinweis das dies und jenes nur da und dort funktioniert. &lt;br /&gt;
&lt;br /&gt;
IDE-Optionen würde ich allerdings durch allgemeinere Anweisungen ersetzen, da bringt es relativ wenig einen Weg für alle 1000 Programme zu beschreiben. Bevor ich da aber irgendwas rumpfusche würde ich dazu lieber erstmal andere Meinungen hören.&lt;br /&gt;
&lt;br /&gt;
man sollte sich imho auch auf reines ANSI-C (99?) beschränken um Neulinge nicht schon bei ihren ersten Gehversuchen mit pfuschigem Code zu &amp;quot;versauen&amp;quot;. void main(void) ist da ein gutes Beispiel. &lt;br /&gt;
Das erspart später auch Fragen wenn User mal an einen Compiler geraten der 100% korrektes ANSI-C will.&lt;br /&gt;
&lt;br /&gt;
War oder ist eigentlich geplant das aus diesem Tutorial mal eins wird das mehr auf Mikrocontrolleranwendungen konzentriert ist? --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:08, 25. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
Es ist sicher nicht so einfach, ein C-Tutorial zu schreiben, ohne seine Zeilgruppe zu kennen. Kommt der Leser vom Nirwana oder ist er ein ausgepuffter XXX-Programmierer, der jetzt auch C schreiben will ? &lt;br /&gt;
Sicher ist irgendeine PC-Workbench als Demonstrationsobjekt für so eine Einschulung weniger geeignet, und eine Spezialisierung auf Controller täte, glaub ich, allen dahingehenden Artikeln gut. &lt;br /&gt;
&lt;br /&gt;
btw: Die Entfernung von &amp;quot;then&amp;quot; ist einserseit ok, gibt's in C ja nicht. Aber die offizielle Bezeichnung der Bedingung ist eben &amp;quot;if-then-else&amp;quot;. Geht man eben auf Theorie oder Praxis ?  Nächstes Problem wäre dann &amp;quot;select case&amp;quot;, der beim C ja mit &amp;quot;switch&amp;quot; beginnt. &lt;br /&gt;
&lt;br /&gt;
--PicNick 10:49, 25. Dez 2005 (CET)&lt;br /&gt;
: zumindest hat dieses Textfeld mit dem if then else den Anschein das es sich um C-Code handelt. Und das produziert einen Compilerfehler. Pseudocode oder Vergleiche mit anderen Sprachen sollten zumindest so gekennzeichnet sein; zB als C-Kommentar. Denn idR tippt der blutige Anfänger einfach alles ab und drückt auf kompilieren. Und postet dann im Forum und beschwert sich das hier falsches Zeug steht. --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:57, 26. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
Es wäre vielleicht sinnvoll dieses Tutorial als grundlegendes nicht compilerspezifisches Tutorial in C zu verstehen. Damit man sich so ein kleinen Einblick vom Standard C machen kann. Eine praktische Einführung könnte man als Ergänzung zu dem GCC-Artikel vielleicht unter [[WinAVR]] ausbauen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 14:03, 25. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
habe gerade mal ein paar Flussdiagramme erstellt und versuche die nach und nach in das Tutorial einzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
und mal noch ein paar Punkte zur Diskussion&lt;br /&gt;
* im Allgemeinen würde ich im Tutorial auf Konstrukte wie &amp;quot;if (foo) bar;&amp;quot; verzichten; sondern alles schön lehrbuchmässig mit { } machen. Das erspart imho einige Verwirrungen. Das es auch anders geht kann man am Ende in einer Art &amp;quot;Tipps und Tricks&amp;quot;-Sektion erklären.&lt;br /&gt;
* die Flussdiagramme und der Pseudo-C-Code ala Anweisung1; reichen imho aus. reale Beispiele wie i=2; statt Anweisung1 sollte sich der Leser selbst denken können. Soll heissen 3 mal dasselbe sagen erscheint mir unsinnig. Ich ändere das jetzt erstmal in der If-Anweisung so wie ich mir das vorstelle und hoffe auf Kritik. &lt;br /&gt;
*'' &amp;quot;Vergleiche von Variablen&amp;quot; sollte man imho mit zur If-Bedingung packen. Da passt es thematisch besser. Konstrukte wie i = a &amp;gt; 2; sind ja eher selten. so grundlegende Änderungen in der Struktur mach ich allerdings nicht einfach so. =&amp;gt; Diskussion willkommen''&lt;br /&gt;
* Vergleiche mit anderen Programmiersprachen, wie zB das fehlende then in C, braucht man imho zumindest im Tutorial nicht. Es würde den Rahmen sprengen alle Unterschiede zu gängigen Sprachen herauszustellen. Natürlich wären Tutorials der Art Pascal=&amp;gt;C toll, das hätte mir auch erspart das ich bei jeder neuen Sprache über die Grundsätze der Variablenzuweisung lesen musste; Aber für alle die nicht mit der je nach Autor erwähnten Sprache aufgewachsen sind wäre das Wissen wie etwas in einer anderen Sprache gelöst wird nutzloses Zusatzwissen; und das stiftet imho sehr viel Verwirrung &amp;quot;es gibt also ein then. Aber das wird in C nicht benutzt...&amp;quot;. Ich denke ihr versteht worauf ich hinauswill.. würde das also lieber weglassen. Und lieber einen Artikel, ähnlich dem Quellcodevergleich, schreiben in dem man sieht wie man bestimmte Sachen unter der und der Sprache löst; allerdings passt das eher in ein Programmierwiki :) --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:57, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Wenn irgendwer mal auf die Idee kommt, ein Tutorial eine anderen Sprache zu schreiben (meinethalben Bascom) wird er bei den Schleifen- und Verzweigungskonstrukten wieder von vorn beginnen. Früher war's mal so, da hat man &amp;quot;Programmieren&amp;quot; erst grundsätzlich gelernt, und das Wissen dann mal in dieser, mal in jener Sprache angewandt. &lt;br /&gt;
--PicNick 11:48, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ich wäre in einem Tutorial auch mehr für die Standard Schreibweise in C. Du musst davon ausgehen das ein C Artikel sowieso selten von jemanden gelesen wird der sich für Bascom entschieden hat. Der Versuch mehrere ganz verschiedene Dinge in einem Artikel zusammenzufassen führt immer zu kommplizierten schwerer verständlich Artikeln. Warum sollte man in bascom die Schleifen etc. nicht wiederholen, Platz haben wir doch, Priorität können wir da auf Verständlichkeit legen.&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 12:37, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
== volatile ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; ist keine Speicherklasse, es ist ein Qualifier (ebenso wie z.B. &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Was die Verwendung von &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; angeht wären noch die SFRs hinzuzufügen, und nicht jede Variable die in einer ISR verwendet wird muss volatile sein. Wenn z.B eine Variable ''nur'' in einer ISR verwendet wird (z.B um Ereignisse zu zählen), dann braucht sie nicht &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; sein. Trotzdem ist der Code ok. &lt;br /&gt;
--[[Benutzer:SprinterSB|SprinterSB]] 18:24, 24. Apr 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
SFR? Jetzt stehe ich grade auf dem Schlauch...&lt;br /&gt;
Das mit ''nur in der ISR'' glaubte ich mit dem Zusatz ''global'' erschlagen zu haben.&lt;br /&gt;
&lt;br /&gt;
Gerade für Anfänger sehe ich in einer globalen nicht-volatile Variablen, die nur in einer ISR&lt;br /&gt;
verwendet wird, die Gefahr, dass man dann später doch &amp;quot;mal eben so&amp;quot; von anderen Codeteilen&lt;br /&gt;
darauf zugreift.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Johannuhrmann|Johannuhrmann]] 21:33, 25. Apr 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Die unkorrekte/fehlende Verwendung von volatile oder nicht atomarem Code ist einer der häufigsten Anfängerfehler, das stimmt. Andererseit ist es ein C-Tutorial (oder soll es mal werden), und da sollte man schon drauf achten, daß man die Dinge korrekt beschreibt. Und mach mal einem Anfänger klar, was der Unterschied ist zwischen&lt;br /&gt;
 int volatile * ptr;&lt;br /&gt;
und&lt;br /&gt;
 int * volatile ptr;&lt;br /&gt;
&lt;br /&gt;
Zugegeben, das fordert an vielen Stellen einen Spagat zwischen Korrektkeit, Verständlichkeit und Pragmatismus. Anhand der Ausnahme könnte man auch erklären, warum es an der Stelle ok ist, volatile nicht zu nehemen. IMHO bringt das für das Verständnis mehr, als eine &amp;quot;muss immer sein&amp;quot; Klausel. &lt;br /&gt;
&lt;br /&gt;
Weiterer Übelstand an der Stelle ist, daß C keine Vorstellung von ISRs hat (zumindest nicht im Standard, da muss jeder Compilerbauer sein eigenes Süppchen machen und ne API stricken). In einem Abschnitts &amp;quot;Interrupts&amp;quot;, wo solche Hinweise vielleicht besser gefunden werden als unter &amp;quot;Speicherklasse&amp;quot; oder &amp;quot;Qualifier&amp;quot; (wer wird so spannende Abschnitte überhaupt anclicken?), hätte man zu Interrupts nicht viel zu sagen. &lt;br /&gt;
&lt;br /&gt;
volatile ist übrigens nur die Hälfte der Miete. Wenn die betroffene Variable ein int ist, recht volatile nicht aus... In [[Fallstricke bei der C-Programmierung]] steht ein bisschen was dazu.&lt;br /&gt;
&lt;br /&gt;
Bei dem Beispiel, wo eine globale Variable nur in einer ISR verwendet wird, könnte man auch eine lokale statische Variable nehmen, stimmt. Jedoch könnte es auch eine globale Variable sein, die nur in ISRs (die sich nicht gegenseitig unterbrechen können) verwendet wird. Einfach zu verstehen (oder zu erklären) sind die Feinheiten freilich nicht gerade. Hier ist dein Ansatz bestimmt besser und einfacher zu verstehen für den Neuling.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:SprinterSB|SprinterSB]] 23:35, 25. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:SprinterSB&amp;diff=7036</id>
		<title>Benutzer Diskussion:SprinterSB</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:SprinterSB&amp;diff=7036"/>
				<updated>2006-04-25T19:47:47Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&lt;br /&gt;
wegen Deinem Buchgewinn ([[Verlosung]]) bräuchte ich noch Adresse. Am besten per Mail senden.&lt;br /&gt;
http://www.roboternetz.de/roboternetzmail.gif&lt;br /&gt;
Gruß Frank&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 16:50, 25. Jan 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Sag, Sprinter, ist das Wunschthema &amp;quot;code-vergleich von avr-compilern&amp;quot; von dir eingefügt ?  Ich weiß nicht ob es gut ist, wenn man als Autor einen Artikel, den man schreiben will, gleich mal als Wunschthema einträgt. Würd' ich nicht gut finden&lt;br /&gt;
&lt;br /&gt;
--PicNick 10:10, 14. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ja, das Thema ist von mir. Warum sollte ich nicht Interesse an einem bestimmten Thema haben dürfen, nur weil ich hier auch als Autor bin? Oder versteh ich schlichtweg nicht, was du sagen willst?&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:SprinterSB|SprinterSB]] 10:58, 14. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Na ja, was soll's. Ich betrachte die Wunschliste als Maßstab, zu erkennen, was unser Klientel, also der Nachwuchs, für Informationen braucht. Ich häng' auch hemmungslos Themen rein, die ich mag, aber ich stell' sie nicht in die Wunschliste, denn vielleicht interessiert es ja gar keinen (ausser mich).&lt;br /&gt;
Ich schreib schon selbst was in die Wunschliste, aber nur, wenn jemand anders darüber schreiben soll. &lt;br /&gt;
(Eben, weil ich es ja nicht weiss). Aber lass gut sein, das wird kompliziert. &lt;br /&gt;
&lt;br /&gt;
Codevergleich: Ich hab den Bascom-code recht gut studiert, GCC in etwa, sonst aber null Ahnung. Aber die, die Bascom schreiben, tun das ja meist, weil sie mit Assembler nix am Hut haben. Können die mit der Info was anfangen ?  Sag's mir, ich weiß es nicht.&lt;br /&gt;
--PicNick 11:24, 23. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
Ob jemand etwas damit anfangen kann oder sich für ein Thema interessiert, obliegt doch jedem einzelnen. Es ist nicht an mir, darüber zu befinden. Um einen Compiler einordnen/bewerten zu können, ist neben der Benutzerfreundlichkeit, dem Funktionumsumfang, dem Preis, der Erweiterbarkeit, der Dokumentation, dem Service, etc doch auch der erzeugte Code ein entscheidendes Kriterium. Immerhin setzt man einen Compiler ein, ''um Code erzeugen'' zu lassen! Das ist seine Haupt-Aufgabe. Einen Code-Vergleich zu lesen ist m.E. etwas anderes, als in die Assembler-Programmierung einzusteigen. Bei einem Auto interessiert dich ja auch nicht nur die Farbe,  wie bequem die Sitze sind, oder ob es elektrische Fenster gibt, sondern auch, was das Teil schluckt oder wie gut die Bremsen sind, oder wie der Durchzug ist. Einen Töff-Fahrer interessieren sogar Leistungs- und Drehmomentkurven, Schräglagenfreiheit oder Nachlauf... Ein &amp;quot;Anwender&amp;quot; kann also durchaus mit Interesse einen Testbericht lesen, ohne selber Tester oder Konstrukteur zu sein.&lt;br /&gt;
&lt;br /&gt;
Was die Wunschliste angeht, wurde da jeder Punkt von einem Autor zugefügt. Aussagekräftiger wäre natürlich eine Strichliste, ''wieviel'' sich an einem Thema interessiert zeigen. &lt;br /&gt;
&lt;br /&gt;
Ich hatte z.B. auch das Wunschthema JTAG angelegt, abwohl ich es weder verwende noch plane einzusetzen. Dennoch finde ich es interessant, und es gibt inzwischen sogar einen Artikel darüber :-)&lt;br /&gt;
----&lt;br /&gt;
ok, alles klar. &lt;br /&gt;
&lt;br /&gt;
Schräglagenfreiheit ? Was hast du für ein Auto ? Ich kenn das nur vom biken, da mißt man das mit der Kniescheibe oder bei der Chopper mit der Fußraste :-) &lt;br /&gt;
--PicNick 15:29, 23. Feb 2006 (CET)&lt;br /&gt;
----&lt;br /&gt;
Hi,&lt;br /&gt;
&lt;br /&gt;
ich wollte mich nur kurz für Deine Korrektur bei [[Interrupt]] bedanken - da hatte ich ja voll den Wurm drin&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Johannuhrmann|Johannuhrmann]] 21:47, 25. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:SprinterSB&amp;diff=7035</id>
		<title>Benutzer Diskussion:SprinterSB</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:SprinterSB&amp;diff=7035"/>
				<updated>2006-04-25T19:47:20Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&lt;br /&gt;
wegen Deinem Buchgewinn ([[Verlosung]]) bräuchte ich noch Adresse. Am besten per Mail senden.&lt;br /&gt;
http://www.roboternetz.de/roboternetzmail.gif&lt;br /&gt;
Gruß Frank&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 16:50, 25. Jan 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Sag, Sprinter, ist das Wunschthema &amp;quot;code-vergleich von avr-compilern&amp;quot; von dir eingefügt ?  Ich weiß nicht ob es gut ist, wenn man als Autor einen Artikel, den man schreiben will, gleich mal als Wunschthema einträgt. Würd' ich nicht gut finden&lt;br /&gt;
&lt;br /&gt;
--PicNick 10:10, 14. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ja, das Thema ist von mir. Warum sollte ich nicht Interesse an einem bestimmten Thema haben dürfen, nur weil ich hier auch als Autor bin? Oder versteh ich schlichtweg nicht, was du sagen willst?&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:SprinterSB|SprinterSB]] 10:58, 14. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Na ja, was soll's. Ich betrachte die Wunschliste als Maßstab, zu erkennen, was unser Klientel, also der Nachwuchs, für Informationen braucht. Ich häng' auch hemmungslos Themen rein, die ich mag, aber ich stell' sie nicht in die Wunschliste, denn vielleicht interessiert es ja gar keinen (ausser mich).&lt;br /&gt;
Ich schreib schon selbst was in die Wunschliste, aber nur, wenn jemand anders darüber schreiben soll. &lt;br /&gt;
(Eben, weil ich es ja nicht weiss). Aber lass gut sein, das wird kompliziert. &lt;br /&gt;
&lt;br /&gt;
Codevergleich: Ich hab den Bascom-code recht gut studiert, GCC in etwa, sonst aber null Ahnung. Aber die, die Bascom schreiben, tun das ja meist, weil sie mit Assembler nix am Hut haben. Können die mit der Info was anfangen ?  Sag's mir, ich weiß es nicht.&lt;br /&gt;
--PicNick 11:24, 23. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
Ob jemand etwas damit anfangen kann oder sich für ein Thema interessiert, obliegt doch jedem einzelnen. Es ist nicht an mir, darüber zu befinden. Um einen Compiler einordnen/bewerten zu können, ist neben der Benutzerfreundlichkeit, dem Funktionumsumfang, dem Preis, der Erweiterbarkeit, der Dokumentation, dem Service, etc doch auch der erzeugte Code ein entscheidendes Kriterium. Immerhin setzt man einen Compiler ein, ''um Code erzeugen'' zu lassen! Das ist seine Haupt-Aufgabe. Einen Code-Vergleich zu lesen ist m.E. etwas anderes, als in die Assembler-Programmierung einzusteigen. Bei einem Auto interessiert dich ja auch nicht nur die Farbe,  wie bequem die Sitze sind, oder ob es elektrische Fenster gibt, sondern auch, was das Teil schluckt oder wie gut die Bremsen sind, oder wie der Durchzug ist. Einen Töff-Fahrer interessieren sogar Leistungs- und Drehmomentkurven, Schräglagenfreiheit oder Nachlauf... Ein &amp;quot;Anwender&amp;quot; kann also durchaus mit Interesse einen Testbericht lesen, ohne selber Tester oder Konstrukteur zu sein.&lt;br /&gt;
&lt;br /&gt;
Was die Wunschliste angeht, wurde da jeder Punkt von einem Autor zugefügt. Aussagekräftiger wäre natürlich eine Strichliste, ''wieviel'' sich an einem Thema interessiert zeigen. &lt;br /&gt;
&lt;br /&gt;
Ich hatte z.B. auch das Wunschthema JTAG angelegt, abwohl ich es weder verwende noch plane einzusetzen. Dennoch finde ich es interessant, und es gibt inzwischen sogar einen Artikel darüber :-)&lt;br /&gt;
----&lt;br /&gt;
ok, alles klar. &lt;br /&gt;
&lt;br /&gt;
Schräglagenfreiheit ? Was hast du für ein Auto ? Ich kenn das nur vom biken, da mißt man das mit der Kniescheibe oder bei der Chopper mit der Fußraste :-) &lt;br /&gt;
--PicNick 15:29, 23. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
Hi,&lt;br /&gt;
&lt;br /&gt;
ich wollte mich nur kurz für Deine Korrektur bei [[Interrupt]] bedanken - da hatte ich ja voll den Wurm drin&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Johannuhrmann|Johannuhrmann]] 21:47, 25. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:C-Tutorial&amp;diff=7034</id>
		<title>Diskussion:C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:C-Tutorial&amp;diff=7034"/>
				<updated>2006-04-25T19:37:21Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* volatile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Habt ihr ihr auch texte aus Buchern oder Tutorials hier reingesetzt?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ich würde die Kapitelnummern weglassen. Wenn Du es mit den Gleichheitszeichen strukturierst reicht das völlig und ist übersichtlicher! &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 22:49, 16. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
== einige Anmerkungen ==&lt;br /&gt;
&lt;br /&gt;
* main ist ''nicht'' vom Typ void, sondern liefert int. Einige Compiler unterstützen main auch als void, dazu müssen aber spezielle Schalter angegeben werden.&lt;br /&gt;
* C unterscheidet zwischen Groß- und Kleinschreibung bei allen Bezeichnern.&lt;br /&gt;
* Quellen werden besser lesbar, wenn man Leerzeichen benutzt, z.b. nach ',' in Argumentlisten oder Deklarationen&lt;br /&gt;
* Quellen werden besser lesbar, wenn man Code-Konventionen verwendet, z.b. Makro-Namen groß zu schreiben: DAS_IST_EIN_MAKRO, Funktionsnamen klein: &amp;lt;tt&amp;gt;eine_funktion()&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;eineFunktion()&amp;lt;/tt&amp;gt; und selber definierte Typen klein mit nachgestelltem _t: &amp;lt;tt&amp;gt;mytype_t&amp;lt;/tt&amp;gt;&lt;br /&gt;
* '''an vielen Stellen ist falscher Code''', der kein C ist! Bevor man so was in ein Tutorial stellt, sollte man sich im klaren sein, was C ist und was nicht. Etwa das Beispiel zu PERSON ist komplett inkorrekt und verwirrt mehr als er erhellt!&lt;br /&gt;
* An vielen Stellen werden Begriffe nicht korrekt benutzt, etwa &amp;quot;Deklaration&amp;quot; anstatt &amp;quot;Definition&amp;quot; oder umgekehrt. Dudem sollte geklärt sein, was der Unterschied überhaup ''ist''.&lt;br /&gt;
* In C gibt es '''kein Typ boolean''', bool o.ä. C ist kein Pascal. Ebenfalls nicht definiert sind TRUE und FALSE. Boolsche Variablen in C werden durch int abgebildet -- zumindest in Standard C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Tutorial ist noch nicht perfekt. Jeder kann natürlich Korrekturen und Verbesserungen einbringen, einfach ändern.&lt;br /&gt;
--[[Benutzer:Bernd|Bernd]] 12:02, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder hat meinen ganzen Respekt, wenn er sich die Arbeit macht und solche ausführlichen Artikel schreibt.&lt;br /&gt;
Bitte das also als positive Kritik zu sehen. &lt;br /&gt;
Aaaaaber: Grad bei einem Tutorial MÜSSEN auch die Details stimmen !! Und jeder Autor trägt da auch Verantwortung !  &lt;br /&gt;
Bitte, die Autoren mögen den Artikel nochmal gaaaanz genau durcharbeiten. Es sind sehr viele Einzelheiten, die den Laien auf's Glatteis führen und den Wissenden die Nase rümpfen lassen. &lt;br /&gt;
*eine variable ist eine variable, das hat mit RAM prinzipiell nix zu tun &lt;br /&gt;
*Wieviele Daten passen in eine Variable ?  (immer genau ein Datum)&lt;br /&gt;
*die Bitanzahl von int ist etwas differenzierter als dargestellt, ganz zu schweigen von &amp;quot;unsigned&amp;quot; Varianten&lt;br /&gt;
*In der Mitte von &amp;quot;for&amp;quot; steht keine Abbruchbedingung, sondern eine Laufbedingung&lt;br /&gt;
*&amp;quot;case sensitiv&amp;quot; heißt nicht, man muß kleinschreiben, sondern man muß drauf aufpassen&lt;br /&gt;
Bitte keine Codebeispiele, wo der Compiler sofort auszuckt. Das muß man ausprobieren oder nochmal lesen, bevor man einen Einsteiger frustrierten in die Wüste schickt.&lt;br /&gt;
--PicNick 12:57, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ihr könnt gerne alles verbessern, aber bitte keine Fehler einbauen. Ihr habt das Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
intVariable = 123;  //entspricht in Pascal:  boolVariable:=true;&lt;br /&gt;
intVariable = 1;    //entspricht in Pascal:  boolVariable:=true;&lt;br /&gt;
intVariable = 0;    //entspricht in Pascal:  boolVariable:=false;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vermutlich falsch verstanden. ''intVariable'' ist ein Variablenname, daher darf es nicht ''int Variable'' lauten.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;quot;aber bitte keine Fehler einbauen.&amp;quot;  Was ist mit &amp;quot;const&amp;quot; ? bleibt das so ? Es ist blöd, wenn da dutzende Leute immer gleichzeitig den selben Artikel beflastern müssen. --PicNick 12:24, 21. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ich bin erst mal fertig. Ihr könnt den Text also ergänzen / ändern wenn ihr wollt. Allerdings folgende Ergänzung von euch, &amp;quot;long long&amp;quot; bei den Typen, ist verwirrend. Man spricht von Double, &amp;quot;long long&amp;quot; ist kein echter Begriff aus der C Fachliteratur.&lt;br /&gt;
: double ist eine Gleitpunktvariable während long long eine 8byte Ganzzahl ist. long long ist C99-Standard. veraltete Fachliteratur? :-) --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:08, 25. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
evtl sollte man sämtliche Compiler-, Betriebssystem- bzw. Programmspezifischen Sachen entfernen bzw umschreiben; zB gibt es unter linux (mit gcc als Standardcompiler) keine conio.h; Und Erklärungen wie &amp;quot;Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&amp;quot; sind für Menschen die nicht die selbe IDE wie der Schreiber nutzen eher verwirrend als nützlich. Allerdings müsste man sich darüber klar werden wie das ganze aussehen soll, ich würde nämlich einfach alles, was nicht überall funktioniert, ganz einfach rauskicken; vielleicht tuts aber auch ein Hinweis das dies und jenes nur da und dort funktioniert. &lt;br /&gt;
&lt;br /&gt;
IDE-Optionen würde ich allerdings durch allgemeinere Anweisungen ersetzen, da bringt es relativ wenig einen Weg für alle 1000 Programme zu beschreiben. Bevor ich da aber irgendwas rumpfusche würde ich dazu lieber erstmal andere Meinungen hören.&lt;br /&gt;
&lt;br /&gt;
man sollte sich imho auch auf reines ANSI-C (99?) beschränken um Neulinge nicht schon bei ihren ersten Gehversuchen mit pfuschigem Code zu &amp;quot;versauen&amp;quot;. void main(void) ist da ein gutes Beispiel. &lt;br /&gt;
Das erspart später auch Fragen wenn User mal an einen Compiler geraten der 100% korrektes ANSI-C will.&lt;br /&gt;
&lt;br /&gt;
War oder ist eigentlich geplant das aus diesem Tutorial mal eins wird das mehr auf Mikrocontrolleranwendungen konzentriert ist? --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:08, 25. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
Es ist sicher nicht so einfach, ein C-Tutorial zu schreiben, ohne seine Zeilgruppe zu kennen. Kommt der Leser vom Nirwana oder ist er ein ausgepuffter XXX-Programmierer, der jetzt auch C schreiben will ? &lt;br /&gt;
Sicher ist irgendeine PC-Workbench als Demonstrationsobjekt für so eine Einschulung weniger geeignet, und eine Spezialisierung auf Controller täte, glaub ich, allen dahingehenden Artikeln gut. &lt;br /&gt;
&lt;br /&gt;
btw: Die Entfernung von &amp;quot;then&amp;quot; ist einserseit ok, gibt's in C ja nicht. Aber die offizielle Bezeichnung der Bedingung ist eben &amp;quot;if-then-else&amp;quot;. Geht man eben auf Theorie oder Praxis ?  Nächstes Problem wäre dann &amp;quot;select case&amp;quot;, der beim C ja mit &amp;quot;switch&amp;quot; beginnt. &lt;br /&gt;
&lt;br /&gt;
--PicNick 10:49, 25. Dez 2005 (CET)&lt;br /&gt;
: zumindest hat dieses Textfeld mit dem if then else den Anschein das es sich um C-Code handelt. Und das produziert einen Compilerfehler. Pseudocode oder Vergleiche mit anderen Sprachen sollten zumindest so gekennzeichnet sein; zB als C-Kommentar. Denn idR tippt der blutige Anfänger einfach alles ab und drückt auf kompilieren. Und postet dann im Forum und beschwert sich das hier falsches Zeug steht. --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:57, 26. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
Es wäre vielleicht sinnvoll dieses Tutorial als grundlegendes nicht compilerspezifisches Tutorial in C zu verstehen. Damit man sich so ein kleinen Einblick vom Standard C machen kann. Eine praktische Einführung könnte man als Ergänzung zu dem GCC-Artikel vielleicht unter [[WinAVR]] ausbauen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 14:03, 25. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
habe gerade mal ein paar Flussdiagramme erstellt und versuche die nach und nach in das Tutorial einzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
und mal noch ein paar Punkte zur Diskussion&lt;br /&gt;
* im Allgemeinen würde ich im Tutorial auf Konstrukte wie &amp;quot;if (foo) bar;&amp;quot; verzichten; sondern alles schön lehrbuchmässig mit { } machen. Das erspart imho einige Verwirrungen. Das es auch anders geht kann man am Ende in einer Art &amp;quot;Tipps und Tricks&amp;quot;-Sektion erklären.&lt;br /&gt;
* die Flussdiagramme und der Pseudo-C-Code ala Anweisung1; reichen imho aus. reale Beispiele wie i=2; statt Anweisung1 sollte sich der Leser selbst denken können. Soll heissen 3 mal dasselbe sagen erscheint mir unsinnig. Ich ändere das jetzt erstmal in der If-Anweisung so wie ich mir das vorstelle und hoffe auf Kritik. &lt;br /&gt;
*'' &amp;quot;Vergleiche von Variablen&amp;quot; sollte man imho mit zur If-Bedingung packen. Da passt es thematisch besser. Konstrukte wie i = a &amp;gt; 2; sind ja eher selten. so grundlegende Änderungen in der Struktur mach ich allerdings nicht einfach so. =&amp;gt; Diskussion willkommen''&lt;br /&gt;
* Vergleiche mit anderen Programmiersprachen, wie zB das fehlende then in C, braucht man imho zumindest im Tutorial nicht. Es würde den Rahmen sprengen alle Unterschiede zu gängigen Sprachen herauszustellen. Natürlich wären Tutorials der Art Pascal=&amp;gt;C toll, das hätte mir auch erspart das ich bei jeder neuen Sprache über die Grundsätze der Variablenzuweisung lesen musste; Aber für alle die nicht mit der je nach Autor erwähnten Sprache aufgewachsen sind wäre das Wissen wie etwas in einer anderen Sprache gelöst wird nutzloses Zusatzwissen; und das stiftet imho sehr viel Verwirrung &amp;quot;es gibt also ein then. Aber das wird in C nicht benutzt...&amp;quot;. Ich denke ihr versteht worauf ich hinauswill.. würde das also lieber weglassen. Und lieber einen Artikel, ähnlich dem Quellcodevergleich, schreiben in dem man sieht wie man bestimmte Sachen unter der und der Sprache löst; allerdings passt das eher in ein Programmierwiki :) --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:57, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Wenn irgendwer mal auf die Idee kommt, ein Tutorial eine anderen Sprache zu schreiben (meinethalben Bascom) wird er bei den Schleifen- und Verzweigungskonstrukten wieder von vorn beginnen. Früher war's mal so, da hat man &amp;quot;Programmieren&amp;quot; erst grundsätzlich gelernt, und das Wissen dann mal in dieser, mal in jener Sprache angewandt. &lt;br /&gt;
--PicNick 11:48, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ich wäre in einem Tutorial auch mehr für die Standard Schreibweise in C. Du musst davon ausgehen das ein C Artikel sowieso selten von jemanden gelesen wird der sich für Bascom entschieden hat. Der Versuch mehrere ganz verschiedene Dinge in einem Artikel zusammenzufassen führt immer zu kommplizierten schwerer verständlich Artikeln. Warum sollte man in bascom die Schleifen etc. nicht wiederholen, Platz haben wir doch, Priorität können wir da auf Verständlichkeit legen.&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 12:37, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
== volatile ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; ist keine Speicherklasse, es ist ein Qualifier (ebenso wie z.B. &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Was die Verwendung von &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; angeht wären noch die SFRs hinzuzufügen, und nicht jede Variable die in einer ISR verwendet wird muss volatile sein. Wenn z.B eine Variable ''nur'' in einer ISR verwendet wird (z.B um Ereignisse zu zählen), dann braucht sie nicht &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; sein. Trotzdem ist der Code ok. &lt;br /&gt;
--[[Benutzer:SprinterSB|SprinterSB]] 18:24, 24. Apr 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
SFR? Jetzt stehe ich grade auf dem Schlauch...&lt;br /&gt;
Das mit ''nur in der ISR'' glaubte ich mit dem Zusatz ''global'' erschlagen zu haben.&lt;br /&gt;
&lt;br /&gt;
Gerade für Anfänger sehe ich in einer globalen nicht-volatile Variablen, die nur in einer ISR&lt;br /&gt;
verwendet wird, die Gefahr, dass man dann später doch &amp;quot;mal eben so&amp;quot; von anderen Codeteilen&lt;br /&gt;
darauf zugreift.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Johannuhrmann|Johannuhrmann]] 21:33, 25. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:C-Tutorial&amp;diff=7033</id>
		<title>Diskussion:C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:C-Tutorial&amp;diff=7033"/>
				<updated>2006-04-25T19:33:36Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* volatile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Habt ihr ihr auch texte aus Buchern oder Tutorials hier reingesetzt?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ich würde die Kapitelnummern weglassen. Wenn Du es mit den Gleichheitszeichen strukturierst reicht das völlig und ist übersichtlicher! &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 22:49, 16. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
== einige Anmerkungen ==&lt;br /&gt;
&lt;br /&gt;
* main ist ''nicht'' vom Typ void, sondern liefert int. Einige Compiler unterstützen main auch als void, dazu müssen aber spezielle Schalter angegeben werden.&lt;br /&gt;
* C unterscheidet zwischen Groß- und Kleinschreibung bei allen Bezeichnern.&lt;br /&gt;
* Quellen werden besser lesbar, wenn man Leerzeichen benutzt, z.b. nach ',' in Argumentlisten oder Deklarationen&lt;br /&gt;
* Quellen werden besser lesbar, wenn man Code-Konventionen verwendet, z.b. Makro-Namen groß zu schreiben: DAS_IST_EIN_MAKRO, Funktionsnamen klein: &amp;lt;tt&amp;gt;eine_funktion()&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;eineFunktion()&amp;lt;/tt&amp;gt; und selber definierte Typen klein mit nachgestelltem _t: &amp;lt;tt&amp;gt;mytype_t&amp;lt;/tt&amp;gt;&lt;br /&gt;
* '''an vielen Stellen ist falscher Code''', der kein C ist! Bevor man so was in ein Tutorial stellt, sollte man sich im klaren sein, was C ist und was nicht. Etwa das Beispiel zu PERSON ist komplett inkorrekt und verwirrt mehr als er erhellt!&lt;br /&gt;
* An vielen Stellen werden Begriffe nicht korrekt benutzt, etwa &amp;quot;Deklaration&amp;quot; anstatt &amp;quot;Definition&amp;quot; oder umgekehrt. Dudem sollte geklärt sein, was der Unterschied überhaup ''ist''.&lt;br /&gt;
* In C gibt es '''kein Typ boolean''', bool o.ä. C ist kein Pascal. Ebenfalls nicht definiert sind TRUE und FALSE. Boolsche Variablen in C werden durch int abgebildet -- zumindest in Standard C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Tutorial ist noch nicht perfekt. Jeder kann natürlich Korrekturen und Verbesserungen einbringen, einfach ändern.&lt;br /&gt;
--[[Benutzer:Bernd|Bernd]] 12:02, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeder hat meinen ganzen Respekt, wenn er sich die Arbeit macht und solche ausführlichen Artikel schreibt.&lt;br /&gt;
Bitte das also als positive Kritik zu sehen. &lt;br /&gt;
Aaaaaber: Grad bei einem Tutorial MÜSSEN auch die Details stimmen !! Und jeder Autor trägt da auch Verantwortung !  &lt;br /&gt;
Bitte, die Autoren mögen den Artikel nochmal gaaaanz genau durcharbeiten. Es sind sehr viele Einzelheiten, die den Laien auf's Glatteis führen und den Wissenden die Nase rümpfen lassen. &lt;br /&gt;
*eine variable ist eine variable, das hat mit RAM prinzipiell nix zu tun &lt;br /&gt;
*Wieviele Daten passen in eine Variable ?  (immer genau ein Datum)&lt;br /&gt;
*die Bitanzahl von int ist etwas differenzierter als dargestellt, ganz zu schweigen von &amp;quot;unsigned&amp;quot; Varianten&lt;br /&gt;
*In der Mitte von &amp;quot;for&amp;quot; steht keine Abbruchbedingung, sondern eine Laufbedingung&lt;br /&gt;
*&amp;quot;case sensitiv&amp;quot; heißt nicht, man muß kleinschreiben, sondern man muß drauf aufpassen&lt;br /&gt;
Bitte keine Codebeispiele, wo der Compiler sofort auszuckt. Das muß man ausprobieren oder nochmal lesen, bevor man einen Einsteiger frustrierten in die Wüste schickt.&lt;br /&gt;
--PicNick 12:57, 20. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ihr könnt gerne alles verbessern, aber bitte keine Fehler einbauen. Ihr habt das Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
intVariable = 123;  //entspricht in Pascal:  boolVariable:=true;&lt;br /&gt;
intVariable = 1;    //entspricht in Pascal:  boolVariable:=true;&lt;br /&gt;
intVariable = 0;    //entspricht in Pascal:  boolVariable:=false;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vermutlich falsch verstanden. ''intVariable'' ist ein Variablenname, daher darf es nicht ''int Variable'' lauten.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;quot;aber bitte keine Fehler einbauen.&amp;quot;  Was ist mit &amp;quot;const&amp;quot; ? bleibt das so ? Es ist blöd, wenn da dutzende Leute immer gleichzeitig den selben Artikel beflastern müssen. --PicNick 12:24, 21. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ich bin erst mal fertig. Ihr könnt den Text also ergänzen / ändern wenn ihr wollt. Allerdings folgende Ergänzung von euch, &amp;quot;long long&amp;quot; bei den Typen, ist verwirrend. Man spricht von Double, &amp;quot;long long&amp;quot; ist kein echter Begriff aus der C Fachliteratur.&lt;br /&gt;
: double ist eine Gleitpunktvariable während long long eine 8byte Ganzzahl ist. long long ist C99-Standard. veraltete Fachliteratur? :-) --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:08, 25. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
evtl sollte man sämtliche Compiler-, Betriebssystem- bzw. Programmspezifischen Sachen entfernen bzw umschreiben; zB gibt es unter linux (mit gcc als Standardcompiler) keine conio.h; Und Erklärungen wie &amp;quot;Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&amp;quot; sind für Menschen die nicht die selbe IDE wie der Schreiber nutzen eher verwirrend als nützlich. Allerdings müsste man sich darüber klar werden wie das ganze aussehen soll, ich würde nämlich einfach alles, was nicht überall funktioniert, ganz einfach rauskicken; vielleicht tuts aber auch ein Hinweis das dies und jenes nur da und dort funktioniert. &lt;br /&gt;
&lt;br /&gt;
IDE-Optionen würde ich allerdings durch allgemeinere Anweisungen ersetzen, da bringt es relativ wenig einen Weg für alle 1000 Programme zu beschreiben. Bevor ich da aber irgendwas rumpfusche würde ich dazu lieber erstmal andere Meinungen hören.&lt;br /&gt;
&lt;br /&gt;
man sollte sich imho auch auf reines ANSI-C (99?) beschränken um Neulinge nicht schon bei ihren ersten Gehversuchen mit pfuschigem Code zu &amp;quot;versauen&amp;quot;. void main(void) ist da ein gutes Beispiel. &lt;br /&gt;
Das erspart später auch Fragen wenn User mal an einen Compiler geraten der 100% korrektes ANSI-C will.&lt;br /&gt;
&lt;br /&gt;
War oder ist eigentlich geplant das aus diesem Tutorial mal eins wird das mehr auf Mikrocontrolleranwendungen konzentriert ist? --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:08, 25. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
Es ist sicher nicht so einfach, ein C-Tutorial zu schreiben, ohne seine Zeilgruppe zu kennen. Kommt der Leser vom Nirwana oder ist er ein ausgepuffter XXX-Programmierer, der jetzt auch C schreiben will ? &lt;br /&gt;
Sicher ist irgendeine PC-Workbench als Demonstrationsobjekt für so eine Einschulung weniger geeignet, und eine Spezialisierung auf Controller täte, glaub ich, allen dahingehenden Artikeln gut. &lt;br /&gt;
&lt;br /&gt;
btw: Die Entfernung von &amp;quot;then&amp;quot; ist einserseit ok, gibt's in C ja nicht. Aber die offizielle Bezeichnung der Bedingung ist eben &amp;quot;if-then-else&amp;quot;. Geht man eben auf Theorie oder Praxis ?  Nächstes Problem wäre dann &amp;quot;select case&amp;quot;, der beim C ja mit &amp;quot;switch&amp;quot; beginnt. &lt;br /&gt;
&lt;br /&gt;
--PicNick 10:49, 25. Dez 2005 (CET)&lt;br /&gt;
: zumindest hat dieses Textfeld mit dem if then else den Anschein das es sich um C-Code handelt. Und das produziert einen Compilerfehler. Pseudocode oder Vergleiche mit anderen Sprachen sollten zumindest so gekennzeichnet sein; zB als C-Kommentar. Denn idR tippt der blutige Anfänger einfach alles ab und drückt auf kompilieren. Und postet dann im Forum und beschwert sich das hier falsches Zeug steht. --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:57, 26. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
Es wäre vielleicht sinnvoll dieses Tutorial als grundlegendes nicht compilerspezifisches Tutorial in C zu verstehen. Damit man sich so ein kleinen Einblick vom Standard C machen kann. Eine praktische Einführung könnte man als Ergänzung zu dem GCC-Artikel vielleicht unter [[WinAVR]] ausbauen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 14:03, 25. Dez 2005 (CET)&lt;br /&gt;
----&lt;br /&gt;
habe gerade mal ein paar Flussdiagramme erstellt und versuche die nach und nach in das Tutorial einzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
und mal noch ein paar Punkte zur Diskussion&lt;br /&gt;
* im Allgemeinen würde ich im Tutorial auf Konstrukte wie &amp;quot;if (foo) bar;&amp;quot; verzichten; sondern alles schön lehrbuchmässig mit { } machen. Das erspart imho einige Verwirrungen. Das es auch anders geht kann man am Ende in einer Art &amp;quot;Tipps und Tricks&amp;quot;-Sektion erklären.&lt;br /&gt;
* die Flussdiagramme und der Pseudo-C-Code ala Anweisung1; reichen imho aus. reale Beispiele wie i=2; statt Anweisung1 sollte sich der Leser selbst denken können. Soll heissen 3 mal dasselbe sagen erscheint mir unsinnig. Ich ändere das jetzt erstmal in der If-Anweisung so wie ich mir das vorstelle und hoffe auf Kritik. &lt;br /&gt;
*'' &amp;quot;Vergleiche von Variablen&amp;quot; sollte man imho mit zur If-Bedingung packen. Da passt es thematisch besser. Konstrukte wie i = a &amp;gt; 2; sind ja eher selten. so grundlegende Änderungen in der Struktur mach ich allerdings nicht einfach so. =&amp;gt; Diskussion willkommen''&lt;br /&gt;
* Vergleiche mit anderen Programmiersprachen, wie zB das fehlende then in C, braucht man imho zumindest im Tutorial nicht. Es würde den Rahmen sprengen alle Unterschiede zu gängigen Sprachen herauszustellen. Natürlich wären Tutorials der Art Pascal=&amp;gt;C toll, das hätte mir auch erspart das ich bei jeder neuen Sprache über die Grundsätze der Variablenzuweisung lesen musste; Aber für alle die nicht mit der je nach Autor erwähnten Sprache aufgewachsen sind wäre das Wissen wie etwas in einer anderen Sprache gelöst wird nutzloses Zusatzwissen; und das stiftet imho sehr viel Verwirrung &amp;quot;es gibt also ein then. Aber das wird in C nicht benutzt...&amp;quot;. Ich denke ihr versteht worauf ich hinauswill.. würde das also lieber weglassen. Und lieber einen Artikel, ähnlich dem Quellcodevergleich, schreiben in dem man sieht wie man bestimmte Sachen unter der und der Sprache löst; allerdings passt das eher in ein Programmierwiki :) --[[Benutzer:Fluchtpunkt|Fluchtpunkt]] 03:57, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Wenn irgendwer mal auf die Idee kommt, ein Tutorial eine anderen Sprache zu schreiben (meinethalben Bascom) wird er bei den Schleifen- und Verzweigungskonstrukten wieder von vorn beginnen. Früher war's mal so, da hat man &amp;quot;Programmieren&amp;quot; erst grundsätzlich gelernt, und das Wissen dann mal in dieser, mal in jener Sprache angewandt. &lt;br /&gt;
--PicNick 11:48, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ich wäre in einem Tutorial auch mehr für die Standard Schreibweise in C. Du musst davon ausgehen das ein C Artikel sowieso selten von jemanden gelesen wird der sich für Bascom entschieden hat. Der Versuch mehrere ganz verschiedene Dinge in einem Artikel zusammenzufassen führt immer zu kommplizierten schwerer verständlich Artikeln. Warum sollte man in bascom die Schleifen etc. nicht wiederholen, Platz haben wir doch, Priorität können wir da auf Verständlichkeit legen.&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 12:37, 26. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
== volatile ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; ist keine Speicherklasse, es ist ein Qualifier (ebenso wie z.B. &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Was die Verwendung von &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; angeht wären noch die SFRs hinzuzufügen, und nicht jede Variable die in einer ISR verwendet wird muss volatile sein. Wenn z.B eine Variable ''nur'' in einer ISR verwendet wird (z.B um Ereignisse zu zählen), dann braucht sie nicht &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; sein. Trotzdem ist der Code ok. &lt;br /&gt;
--[[Benutzer:SprinterSB|SprinterSB]] 18:24, 24. Apr 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
SFR? Jetzt stehe ich grade auf dem Schlauch...&lt;br /&gt;
Das mit ''nur in der ISR'' glaubte ich mit dem Zusatz ''global'' erschlagen zu haben.&lt;br /&gt;
&lt;br /&gt;
Gerade für Anfänger sehe ich in einer globalen nicht-volatile Variablen, die nur in einer ISR&lt;br /&gt;
verwendet wird, die Gefahr, dass man dann später doch &amp;quot;mal eben so&amp;quot; von anderen Codeteilen&lt;br /&gt;
darauf zugreift.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Johannuhrmann|Johannuhrmann]] 21:33, 25. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7019</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7019"/>
				<updated>2006-04-24T14:59:14Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Speicherklassen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:Johannuhrmann&amp;diff=7017</id>
		<title>Benutzer Diskussion:Johannuhrmann</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:Johannuhrmann&amp;diff=7017"/>
				<updated>2006-04-24T14:43:57Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wer will, kann mir hier eine Nachricht hinterlassen...&lt;br /&gt;
--[[Benutzer:Johannuhrmann|Johannuhrmann]] 16:43, 24. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7007</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=7007"/>
				<updated>2006-04-23T18:16:55Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Logische (boolsche) Operatoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein kurzer Einblick in die Programmiersprache C&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
C wurde 1971 als Gundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachedefinition entwickelt. C ist mittlerweile von ANSI und ISO standardisiert.&lt;br /&gt;
Heutzutage ist C (und ihr Nachfolger C++) die dominierende Programmiersprache. Sehr viele Anwendungen sind in C geschrieben. Leider ist C jedoch nicht einfach zu lernen, daher eignet es sich nur bedingt für Anfänger. Mit etwas Übung kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
C ist sehr eng an Assembler angelehnt, aber trotzdem Hardware-unabhängig. Das bedeutet, Sie können maschinennahe Programme sehr leicht (aber nicht ganz ohne Aufwand) auf ein anderes System portieren. Sie benötigen dazu lediglich einen anderen Compiler, und Inline-Assembler Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int Zahl1;&lt;br /&gt;
char Zeichen1;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   int zahl2;&lt;br /&gt;
&lt;br /&gt;
   /* Anweisungen */&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung (die Erklärungen folgen): &lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtige, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Unterprogramm main=&lt;br /&gt;
Unterprogramme lernen Sie zwar erst später kennen, aber dieses eine muß sein. In Gegensatz zu anderen Programmiersprachen gibt es in C kein &amp;quot;Hauptprogramm&amp;quot;, sondern nur Unterprogramme. Aber woher soll der Computer wissen, welches Unterprogramm er am Beginn ausführen soll? Ganz einfach, er führt immer das Unterprogramm &amp;quot;main&amp;quot; aus. Dieses ist sozusagen das &amp;quot;Hauptprogramm&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein Integer Wert als Ergebnis zurückgeliefert. Beim [[Microcontroller]] ist main das Startprogramm, das nach dem RESET aufgerufen wird. Hier gibt es dann also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß main oft als oft auch als void (Parameterfrei) definiert wird, wie oben im Beispiel zu erkennen. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* void Definition von main ist nur beim Controller üblich&lt;br /&gt;
 * spezielle Compilereinstellungen sind nötig, damit bei dieser Definition von main&lt;br /&gt;
 * kein Fehler/Warnung erzeugt wird. &lt;br /&gt;
 */&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was das bedeutet, lernen Sie in einem späteren Kapitel. Wichtig ist nur: ohne main ist kein Programm komplett, es lässt sich dann auch nicht ausführen!&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. Doch was bedeuten Sie? Einem Pascal-Kenner ist das schnell erklärt: { entspricht BEGIN, } entspricht END. Wenn ihnen auch das unbekannt ist, dann hilft Ihnen hoffentlich die folgende Erklärung.&lt;br /&gt;
Programme sind in Abschnitte unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Beispiele stellt ein eigenständiges Stück Code dar. Daher müssen Sie es auch als solches kennzeichnen. Dies geschieht mit { und }. { bedeutet so viel wie &amp;quot;Block Anfang&amp;quot; und } bedeutet &amp;quot;Block Ende&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{    //der Block &amp;quot;main&amp;quot; beginnt&lt;br /&gt;
 int Zahl;&lt;br /&gt;
 &lt;br /&gt;
 {   //ein &amp;quot;namenloser&amp;quot; Block beginnt&lt;br /&gt;
   //hier stehen Anweisungen&lt;br /&gt;
 }   //der &amp;quot;namenlose&amp;quot; Block endet&lt;br /&gt;
}    //der Block &amp;quot;main&amp;quot; endet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkung:''' &lt;br /&gt;
Der &amp;quot;namenlose&amp;quot; Block ist eigentlich unnötig. In den folgenden Kapiteln lernen Sie jedoch bessere Beispiele kennen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, und welcher Art diese Daten sind. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können Sie alle möglichen ASCII-Zeichen speichern (alles, was Sie mit der Tastatur erzeugen können).&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit Controller) und dem Compiler ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variable dieses Types können Sie ganze Zahlen abspeichern, also z.B. 1, -2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann recht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | −9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
=== Boolean (Logische Variablen)===&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: In Zukunft werden ich oft 1 als Synonym für &amp;quot;ungleich 0&amp;quot; verwenden. Bitte beachten Sie jedoch, das eine Variable, die TRUE ist, nicht unbedingt den Wert 1 haben muß. Sie muß lediglich ungleich 0 sein!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Felder===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte ''Arrays'', zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten! Ein ihnen bereits bekanntes Beispiel für ein Array ist ein String. Ein String ist nichts anderes als ein Array des Datentypes char.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:''' Datentyp Variablenname[Anzahl]&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für 3 Variablen. Da der Index immer bei 0 beginnt, greift man also mit [0], [1] und [2] auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zaehler;&lt;br /&gt;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!&lt;br /&gt;
&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++)&lt;br /&gt;
  {&lt;br /&gt;
    printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, Zaehler);&lt;br /&gt;
    scanf (&amp;quot;%d&amp;quot;, &amp;amp; Zahlen[Zaehler]);&lt;br /&gt;
    printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
  for (Zaehler=0; Zaehler&amp;lt;10; Zaehler++) &lt;br /&gt;
     printf (&amp;quot;Zahl %d war: %d\n&amp;quot;, Zaehler, Zahlen[Zaehler]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen:''' &lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung undefinierbare Dinge passieren, da dadurch andere Variableninhalte oder Programmcode überschrieben wird. Im schlimmsten Fall könnte sogar der Computer/Controller abstürzen. Also achten Sie darauf, daß Sie keine ungültigen Werte als Index angeben!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Felder===&lt;br /&gt;
Manchmal benötigen mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert X: %d,  Y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==Strings (Zeichenketten)==&lt;br /&gt;
Bei einem String handelt es sich um ein Array, das aus einzelnen Zeichen gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
  char vname[20], nname[20];&lt;br /&gt;
  char telnr[15];&lt;br /&gt;
  int alter;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden 4 Variablen angelege: 3 Strings und ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach &lt;br /&gt;
 struct Person Variablenname;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  struct Person hubert;&lt;br /&gt;
&lt;br /&gt;
  hubert.alter = 32;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer genau definierten stelle im Speicher. Diese Stelle kann man in erfahrung bringen. Wie man das macht und was das überhaupt für Vorteile bringt, erfahren Sie in diesem Abschnitt.&lt;br /&gt;
Ein Zeiger ist im Prinzip eine (int-) Variable. In ihr ist jedoch keine Zahl gespeichert, sondern eine &amp;quot;Adresse&amp;quot;. Diese gibt eine bestimmte Position im Arbeitsspeicher dar. Hier sehen Sie, wie man einen Zeiger definiert und mit ihm arbeitet: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  int *Zeiger;&lt;br /&gt;
 &lt;br /&gt;
  Zeiger=&amp;amp;Zahl;&lt;br /&gt;
  *Zeiger=12;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;%d = %d&amp;quot;, Zahl, *Zeiger);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Um einen Zeiger anzulegen, gibt man folgendes an: Datentyp, dann einen Stern (*), anschließend den Namen (und einen Strichpunkt). &lt;br /&gt;
Um einen Zeiger auf eine bestimmte Zahl &amp;quot;zeigen&amp;quot; zu lassen, muß man dem Zeiger die Adresse einer Variablen zuordnen. Das funktioniert mittels dem Adress-Operator &amp;amp; (Zeiger=&amp;amp;Zahl). &lt;br /&gt;
Jetzt möchten Sie dem Zeiger einen Wert zuweisen. Aber natürlich nicht dem Zeiger, sondern der Variablen, auf die der Zeiger &amp;quot;zeigt&amp;quot;. Na, &amp;quot;Zahl=Wert;&amp;quot;, werden Sie sagen. Aber wozu dann Zeiger? Na, ja, jednefalls geht das mittels des &amp;quot;Inhalts-Operators&amp;quot; * (*Zeiger=12). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an printf (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
Teilweise erlauben C-Compiler auch die Verwendung des Dollar-Zeichens &amp;lt;tt&amp;gt;'''$'''&amp;lt;/tt&amp;gt; in Variablennaben.&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zahl1, Zahl2;&lt;br /&gt;
char Zeichen;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  float gleitZahl1;&lt;br /&gt;
  /* Anweisungen */&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Erklärung: In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl1, Zahl2 = 12;&lt;br /&gt;
  char Zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  Zahl1 = 52;&lt;br /&gt;
  Zeichen1 = Zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;Zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;Zahl1=52&amp;lt;/tt&amp;gt;: Hier wird der Variablen Zahl1 der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;Zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normale Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erst Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also int und char dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable FALSE, ansonsten ist Sie TRUE. &lt;br /&gt;
 intVariable = !0;   // entspricht TRUE&lt;br /&gt;
 intVariable = 0;    // entspricht FALSE&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Sie können Variablen miteinander vergleichen. Das geschieht mit einem der folgenden Zeichen mit den normalen mathematischen Regeln: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Als Ergebnis bekommen Sie einen logischen Ausdruck in Form einer int-Zahl. &lt;br /&gt;
 intVariable = Zahl1 &amp;lt;= Zahl2;&lt;br /&gt;
das komplette Beispiel zeigt es deutlicher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  int i;&lt;br /&gt;
  int z1, z2;&lt;br /&gt;
&lt;br /&gt;
  z1 = 5;&lt;br /&gt;
  z2 = 100;&lt;br /&gt;
  i = z1 &amp;lt;= z1  /* Ein Vergleich. Die int-Variable i wird wahr, da z1 kleiner als z2 */&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Ergebnis: %d\n&amp;quot;, i);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich 0 (&amp;quot;wahr&amp;quot;), wenn z1 kleiner oder gleich z2 ist. Ist z1 jedoch größer als z2, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich 0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es dafür ein Schlüsselwort in C:&lt;br /&gt;
 const ''datentyp'' name = value;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per ''include'' eingebunden wird.&lt;br /&gt;
 const float pi = 3.141592;  /* Zuweisung bei der Defininition der Variablen */&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchen Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem Sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken, es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Eine externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im RAM; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wei man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein LValue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert. &lt;br /&gt;
Eine Variable ist so ein LValue, der etwas zugewiesen werden kann:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein LValue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
erzeugt einen Compilerfehler, der etwas lautet könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenheit der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, wenn das Ergebnis bereits feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  (x &amp;gt; 5) || datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) /* gut */&lt;br /&gt;
  datei_auf_festplatte_gefunden(&amp;quot;hallo.txt&amp;quot;) || (x &amp;gt; 5) /* nicht so gut */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;datei_auf_festplatte_gefunden&amp;lt;/tt&amp;gt; ist fiktiv und steht für eine Funktion,&lt;br /&gt;
die eine aufwändige Operation durchführt.&lt;br /&gt;
Beide Zeilen ergeben &amp;lt;tt&amp;gt;wahr&amp;lt;/tt&amp;gt; wenn die Variable x einen Wert größer 5 hat oder&lt;br /&gt;
es eine Datei namens &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte gibt.&lt;br /&gt;
&lt;br /&gt;
Wo ist also der Unterschied?&amp;lt;br&amp;gt;&lt;br /&gt;
In der ersten Zeile wird geprüft, ob x größer als 5 ist und wenn das der Fall ist,&lt;br /&gt;
dann wird ''nicht mehr geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte existiert.&lt;br /&gt;
In der zweiten Zeile wird ''immer geprüft'', ob &amp;lt;tt&amp;gt;hallo.txt&amp;lt;/tt&amp;gt; auf der Festplatte&lt;br /&gt;
existiert und erst, wenn sie nicht gefunden wird, wird die Variable x ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
==Komma Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Bedingte Zuweisung===&lt;br /&gt;
 lvalue = (bediungung) ? if-ausdruck : else-ausdruck;&lt;br /&gt;
&lt;br /&gt;
==Blöcke==&lt;br /&gt;
Selbst Blöcke haben in C einen Wert, der in einer Berechnung verwendet werden kann.&lt;br /&gt;
Der Wert eines Blockes ist der Wert der letzten Anweisung des Blocks. &lt;br /&gt;
Der Block muss un runden Klammern stehen:&lt;br /&gt;
 int sum;&lt;br /&gt;
 sum = ({&lt;br /&gt;
    int i, s = 0;&lt;br /&gt;
    for (i=1; i&amp;lt;= 100; i++)&lt;br /&gt;
       s += i;&lt;br /&gt;
    s;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Makro &amp;lt;tt&amp;gt;PSTR&amp;lt;/tt&amp;gt; von avr-gcc, &lt;br /&gt;
das einen String ins Flash legt und die Adresse zurückliefert, was nur in einer&lt;br /&gt;
Instruktion nicht machbar wäre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define PSTR(s)                         \&lt;br /&gt;
  ({                                    \ &lt;br /&gt;
      static char __c[] PROGMEM = (s);  \&lt;br /&gt;
      __c;                              \&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
==Boolsche Logik==&lt;br /&gt;
Boolean-Variablen können miteinander verknüpft werden. Dies geschieht mit den boolschen Operatoren &amp;amp;&amp;amp; ( logisches &amp;quot;und&amp;quot;), || (logisches &amp;quot;oder&amp;quot;) und ! (logisches &amp;quot;nicht&amp;quot;) (es gibt noch weitere, auf die hier nicht eingegangen wird). &lt;br /&gt;
&lt;br /&gt;
 b1= b2 &amp;amp;&amp;amp; b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann 1 (TRUE), wenn b2 und (&amp;quot;AND&amp;quot;) b3 1 (TRUE) sind. Ist eine der beiden (oder auch beide) 0 (FALSE), dann ist b1 ebenfalls 0 (FALSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= b2 || b3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn b2 oder (&amp;quot;OR&amp;quot;) b3 TRUE ist. Ist also einer (oder beide) TRUE, dann ist auch b1 TRUE, sind beide FALSE, ist auch b1 FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 b1= !b2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Wert von b1 ist dann TRUE, wenn der von b2 FALSE ist. Die NOT Verknüpfung &amp;quot;dreht den logischen Wert der Variablen um&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung==&lt;br /&gt;
Syntax: IF (Bedingung) Anweisung;&lt;br /&gt;
Mit Hilfe der IF Anweisung kann man Codeteile (Blöcke) ausführen lassen, wenn die dazugehörige Bedingung erfüllt (TRUE) ist. Im Flussdiagramm sieht eine If-Anweisung folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
[[bild:ifthenelse.png]]&lt;br /&gt;
&lt;br /&gt;
Und in C schreibt man:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (Bedingung)        // WENN&lt;br /&gt;
{                     // DANN&lt;br /&gt;
       Anweisung1;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{                     // SONST&lt;br /&gt;
       Anweisung2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wenn die Bedingung wahr ist wird Anweisung1 ausgeführt. Anschliessend wird aus der If-Bedingung herausgesprungen. Anweisung2 wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung unwahr wird gleich zu Anweisung2 gesprungen, diese ausgeführt, und anschliessend wird die If-Bedingung beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Ein häufiger Fehler ist statt if(a == 23) etwas wie if(a = 23) zu schreiben. Hier wird allerdings nicht geprüft ob die Variable a gleich 23 ist, sondern der Variable a wird der Wert 23 zugewiesen, und das ist eine wahre Aussage. Anschliessend wird demzufolge der &amp;quot;DANN&amp;quot;-Teil ausgeführt.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken. Somit ist dieser kleine Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise if(23 == a). Wenn man dort anstatt des Vergleichsoperator '==' den Zuweisungsoperator '=' verwendet spuckt der Compiler sehr wohl einen Fehler aus.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist das schreiben von if(Bedingung)''';''' Richtig müsste es heissen &amp;quot;if(Bedingung)&amp;quot; Das fehlerhafte Semikolon im ersten Fall interpretiert der Compiler bereits als Anweisung. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt. Hier also ebenfalls besser zweimal hinschauen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' while (Bedingung) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die WHILE-Schleife wird solange durchlaufen, wie die Bedingung erfüllt (TRUE) ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Bei mehreren Anweisungen benötigen man einen Block! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zahl1=0;&lt;br /&gt;
while (Zahl1&amp;lt;3)&lt;br /&gt;
{&lt;br /&gt;
   Zahl1=Zahl1+1;&lt;br /&gt;
   Zahl2=Zahl2*2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife 3 mal durchlaufen. Zu Beginn des 4. Durchlaufes ist die Bedingung FALSE (Zahl1 ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
===&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' do  { Anweisung; }while (Bedingung);&lt;br /&gt;
&lt;br /&gt;
Die DO WHILE-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist. Das ist dann sinnvoll, wenn der Vergleichswert für die Bedingung erst im Anweisungsblock gesetzt wird &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char bData;&lt;br /&gt;
do {&lt;br /&gt;
    bData = getch();   // Tastatureingabe (s.u.) &lt;br /&gt;
}while (bData != 13);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange etwas anderes als 13 (&amp;lt;ENTER&amp;gt;) eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleife===&lt;br /&gt;
'''Syntax:''' for (Zuweisung;Bedingung;Inkrement) { Anweisung; }&lt;br /&gt;
&lt;br /&gt;
Die FOR-Schleife ist eine spezielle WHILE-Variante für die Formulierung von Zählschleifen. Die angegebene Variable wird am Anfang auf einen Wert gesetzt. Danach wird sie nach jedem Durchlauf verändert (meist um 1 erhöht). Hat sie einen bestimmten Wert erreicht, wird die Schleife beendet. Innerhalb des Anweisungsblockes können Sie auf die Variable zugreifen, d.h. Sie können sie auch verändern. Das ist jedoch nicht ratsam. Wollen Sie mehrere Anweisungen ausführen, benötigen Sie eine Block&lt;br /&gt;
&lt;br /&gt;
Die gesammte Schleife wird solange durchgeführt, wie die Bedingung TRUE ist (d.h. Sie brauchen garnicht die Zählvariable abfragen, Sie können hier auch jede andere Variable auswerten). Inkrement letztendlich wird nach jedem Schleifendurchlauf ausgeführt. Hier kann man z.B. den Zähler erhöhen.&lt;br /&gt;
&lt;br /&gt;
Die Theorie ist schwer, die Praxis nicht so sehr... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
for (Zaehler = 1; Zaehler &amp;lt;= 10; Zaehler++) &lt;br /&gt;
{&lt;br /&gt;
   Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Äquivalent als &amp;quot;WHILE&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int Zaehler;&lt;br /&gt;
     Zaehler = 1;                      // Anfangswerte&lt;br /&gt;
     while (Zaehler &amp;lt;= 10)             // Bedingung&lt;br /&gt;
     {&lt;br /&gt;
        Zahl2 = Zahl2 + Zaehler;&lt;br /&gt;
        Zaehler++;                    // Inkrement&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Zahl2 in jedem Schleifendurchlauf um die Zählvariable Zaehler erhöht. Da Zaehler nacheinander die Werte von 1 bis 10 hat, ist in Zahl2 nach der Schleife die Summe der Zahlen 1 bis 10 gespeichert.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Zaehler=1 bedeutet, dass der Variablen Zaehler vor dem 1. Schleifendurchlauf der Wert 1 zugewiesen wird. &lt;br /&gt;
Zaehler&amp;lt;=10 ist die Schleifenbedingung; ist sie FALSE, wird die Schleife beendet. &lt;br /&gt;
Zaehler++ bedeutet, dass Zaehler nach jedem Durchlauf um 1 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
=Ein- und Ausgabe=&lt;br /&gt;
&lt;br /&gt;
==Bildschirm-Ausgabe==&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Der dazu notwendige Befehl ist printf (das f ist KEIN Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker umgeleitet, aber das ist eine andere Geschichte). Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. int, char, float, double) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
    int Zahl1 = 12;&lt;br /&gt;
    char Zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zahl1 ist: %d \n&amp;quot;, Zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %c \n&amp;quot;, Zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen Zeichen1 ist: %d \n&amp;quot;, Zeichen1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
Dass das Programm nach dem Compilieren und Ausführen sofort wieder beendet wird, ist nicht Ihr Fehler. Drücken Sie [ALT] + [F5], um zum Ausgabebildschirm zu kommen!&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
Der 1. printf Befehl gibt Text aus. Das Zeichen am Ende (\n) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der 2. printf-Befehl gibt auch Text aus, am Ende befindet sich wieder das \n, um einen Zeilenvorschub zu erreichen. Das %d wird vom Compiler durch den 1. Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird %d also durch den Wert der Variablen Zahl1 ersetzt. Das d im %d bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der 3. Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet %c &amp;quot;char&amp;quot; (Zeichen). Es wird also %c durch 'A' ersetzt. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe verhält sich merkwürdig &amp;amp;#150; es wird doch tatsächlich eine Zahl ausgegeben, obwohl der Parameter ein Zeichen (char) ist. Aber:&lt;br /&gt;
%d im Text bedeutet, dass eine Zahl auszugeben ist.&lt;br /&gt;
ein char kann ja auch als Zahl interpretiert werden.&lt;br /&gt;
Es wird also 65 (der ASCII-Wert von 'A') ausgegeben. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer char Variablen! &lt;br /&gt;
&lt;br /&gt;
'''Bildschirm löschen'''&lt;br /&gt;
&lt;br /&gt;
Oft sind von anderen Programmen noch &amp;quot;Rückstände&amp;quot; vorhanden. Nicht nur um die zu beseitigen, brauchen Sie einen &amp;quot;Bildschirm-Lösch-Befehl&amp;quot;. Dieser ist in conio.h definiert und nennt sich &amp;quot;clrscr&amp;quot; (&amp;quot;clear screen&amp;quot;, deut: &amp;quot;lösche Bildschirm&amp;quot;). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  clrscr();&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tastatur-Eingabe==&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Der wichtigste Befehl ist &amp;quot;scanf&amp;quot;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von printf, nur daß man außer den %c und %d keine weiteren Angaben im &amp;quot;Text&amp;quot; machen darf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf(&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl1);&lt;br /&gt;
printf(&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf(&amp;quot;%c&amp;quot;,&amp;amp;Zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Diese Zahl wird in Zahl1 abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm scanf bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
===getch===&lt;br /&gt;
getch ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  char zeichen;&lt;br /&gt;
  zeichen = getch();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu scanf muß man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable zeichen wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.&lt;br /&gt;
&lt;br /&gt;
Eine weiter Möglichkeit der Anwendung von getch ist es, wenn Sie einfach &amp;quot;getch();&amp;quot; als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab.&lt;br /&gt;
&lt;br /&gt;
===kbhit===&lt;br /&gt;
Dies ist ebenfalls eine Funktion, die eine boolschen Ausdruck zurück liefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, und mit scanf oder getch abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers gespeichert. Wenn das Programm nun eine Eingabe erwartet, werden die gespeicherten Zeichen &amp;quot;verwendet&amp;quot;. Dies lauft jedoch so schnell ab, daß der Benutzer davon nichts merkt). Ist diese Variable TRUE, dann ist ein Zeichen abfragebereit, sonst nicht: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ( !kbhit() )&lt;br /&gt;
{&lt;br /&gt;
  Zahl1=Zahl1+1;&lt;br /&gt;
  printf(&amp;quot;%d\n&amp;quot;,Zahl1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Programmteil erhöht solange Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Allgemeines zu Unterprogrammen=&lt;br /&gt;
Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes &amp;quot;Unterprogramm&amp;quot; schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.&lt;br /&gt;
Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen: &lt;br /&gt;
&lt;br /&gt;
==Funktionen==&lt;br /&gt;
'''Syntax:''' Rückgabe-Typ Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int hoch2(int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl=Param1*Param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1,ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;zahl1);&lt;br /&gt;
  ergebnis = hoch2(zahl1);&lt;br /&gt;
  printf(&amp;quot;%d hoch 2 = %d\n&amp;quot;,zahl1,ergebnis);&lt;br /&gt;
  printf(&amp;quot;5 hoch 2 = %d\n&amp;quot;,hoch2(5));&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen. &lt;br /&gt;
Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich. &lt;br /&gt;
In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Variablen an. Bei z.B. getch() ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt in Klammern die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich! &lt;br /&gt;
Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden. &lt;br /&gt;
Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung &amp;quot;return&amp;quot; und dem Rückgabewert. &lt;br /&gt;
Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an &amp;quot;Variable=Funktion(Parameter);&amp;quot;. Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile). &lt;br /&gt;
Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
==Prozedur==&lt;br /&gt;
'''Syntax:''' void Name(Parameterliste);&lt;br /&gt;
&lt;br /&gt;
Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede: &lt;br /&gt;
&lt;br /&gt;
Als Rückgabe-Datentyp wird void angegeben. &lt;br /&gt;
Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie FUNCTION's) sonder wird wie eine normale Anweisung behandelt (wie z.B. printf). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Param1);&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Der Wert der Variablen beträgt: %d\n&amp;quot;,Param1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   int Zahl1;&lt;br /&gt;
   ausgeben(23);&lt;br /&gt;
   Zahl1=4;&lt;br /&gt;
   ausgeben(Zahl1);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bemerkungen zum Programm:''' &lt;br /&gt;
Durch den Befehl &amp;quot;ausgeben(23)&amp;quot; wird die Prozedur &amp;quot;ausgeben&amp;quot; mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird. &lt;br /&gt;
Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren (&amp;quot;Zahl1=4&amp;quot;). &lt;br /&gt;
Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben. &lt;br /&gt;
Unterprogramme ohne Parameter&lt;br /&gt;
Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, das Sie die Parameter angeben. void bedeutet &amp;quot;es gibt keine Parameter&amp;quot;. &amp;quot;void main(void)&amp;quot; bedeutet also: &amp;quot;Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, z.B. getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl &amp;quot;getch;&amp;quot; führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch. Alles klar? Na ja, jedenfalls: Beim Aufruf jedes Unterpgrogrammes immmer Klammern angeben.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des 1. Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Definition davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende, rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. ''void ausgeben(int Zahl); '' ) und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, daß Prototypen einen Strichpunkt am Ende haben! &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang des der Quellcodedatei oder in einerm Header-Datei die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl);  //Der Prototyp&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
   clrscr();&lt;br /&gt;
   ausgeben(12);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben(int Zahl)   //Die eigentliche Prozedur&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Ausgabe: %d\n&amp;quot;,Zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Besondere Datentypen=&lt;br /&gt;
&lt;br /&gt;
==strcpy==&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21],eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy(stri1,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  clrscr();&lt;br /&gt;
  printf(&amp;quot;Der 1. String: %s\n&amp;quot;,stri1);&lt;br /&gt;
  printf(&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%s&amp;quot;,eingabe);&lt;br /&gt;
  strcpy(stri1,eingabe);&lt;br /&gt;
  printf(&amp;quot;\n %s = %s&amp;quot;,stri1,eingabe);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein &amp;amp; bei scanf angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden 2 gleich große Strings definiert: stri1 und eingabe, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
stri1 wird der Wert &amp;quot;hallo&amp;quot; zugewiesen. Das 0-Zeichen wird automatisch angefügt! &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings. &lt;br /&gt;
Sie werden gebeten, eine String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable stri1 kopiert. &lt;br /&gt;
Beide Strings (die ja nun auch den selben Wert haben) werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==strlen==&lt;br /&gt;
Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;DAs ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  strcpy(stri,&amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen(stri) );&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeiger als Parameter===&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der Computer legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an scanf - da übergeben Sie ja auch die Adresse einer Variablen (&amp;quot;&amp;amp;Variable&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe(int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger=*zeiger+1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  int Zahl;&lt;br /&gt;
  printf(&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;Zahl);&lt;br /&gt;
  erhoehe(&amp;amp;Zahl);&lt;br /&gt;
  printf(&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;,Zahl);&lt;br /&gt;
  getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;==&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle: &amp;quot;dir *.exe&amp;quot;, &amp;quot;copy *.* a:&amp;quot; oder &amp;quot;ls -la&amp;quot;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;&amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Autoren'''&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
&lt;br /&gt;
'''Quellen:'''&lt;br /&gt;
* Kernighan und Ritchie - Buch&lt;br /&gt;
* Christian Wirth , C Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer:Johannuhrmann&amp;diff=7005</id>
		<title>Benutzer:Johannuhrmann</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer:Johannuhrmann&amp;diff=7005"/>
				<updated>2006-04-23T10:35:00Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Johann Uhrmann'''&lt;br /&gt;
&lt;br /&gt;
Informatiker, begeisterter Bastler und Programmierer&lt;br /&gt;
&lt;br /&gt;
Admin des wenig genutzten [[http://www.roboternetz.de/phpBB2/chatroom.php Roboternetz-Chats]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Interrupt&amp;diff=7004</id>
		<title>Interrupt</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Interrupt&amp;diff=7004"/>
				<updated>2006-04-23T10:27:48Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Interrupt Request===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Ein Interrupt ist ein Signal, meist von einem externen Gerät, mit dem der Prozessor aufgefordert wird, den aktuellen Programmablauf anzuhalten (zu unterbrechen) und eine sog. Unterbrechungsroutine ([[ISR]]) aufzurufen.&amp;quot; (Zitat aus der Wikipedia [http://de.wikipedia.org/wiki/Interrupt_Request Interrupt Request])&lt;br /&gt;
&lt;br /&gt;
Man unterscheidet zwischen maskierbaren (d.h. Interrupts, die man unterdrücken kann) und nicht maskierbaren Interrupts.&lt;br /&gt;
&lt;br /&gt;
Sind die Interrupts nicht unterdrückt, wird der normale Programmfluss unterbrochen, sobald ein externes Signal an einer von mehreren Interrupt-Eingängen anliegt. Es wird eine spezielle Unterroutine abgearbeitet ([[ISR]]), die auf das externe Signal reagieren und es ggf. abschalten muss (um erneute Interrupt Requests und damit Endlosschleifen zu vermeiden).&lt;br /&gt;
&lt;br /&gt;
Nicht maskierbare Interrupts werden vor allem für besonders schwerwiegende Ereignisse (z.B. zu hohe Umgebungstemperatur) verwendet, da hier das Steuerprogramm immer unmittelbar reagieren muss, um Schaden vom System abwenden zu können (z.B. indem es eine Kühlung aktiviert).&lt;br /&gt;
&lt;br /&gt;
Da die Anzahl der Interrupt-Leitungen bei Microprozessoren meist begrenzt sind, werden oft Interrupt-Controller vorgeschaltet, die auch kaskadiert (in Serie geschaltet) werden können. Um in solch einem System die Interrupt-Quelle eindeutig identifizieren zu können, muss diese dem Microcontroller über den normalen Datenbus z.B. eine Kennung übermitteln können. Die dazu nötige Kommunikation zwischen Microcontroller und Interrupt-Quelle findet in der Interrupt Service Routine statt. &lt;br /&gt;
&lt;br /&gt;
===Unterschiede zum Polling===&lt;br /&gt;
&lt;br /&gt;
Alternativ zur Verwendung von Interrupts lässt sich das Auftreten eines externes Ereignisses auch durch das regelmäßige Abfragen des externen Gerätes erkennen. Diese Technik nennt sich Polling (der Prozessor ''frägt'' das externe Gerät).&lt;br /&gt;
&lt;br /&gt;
'''Vorteile des Pollings gegenüber der Verwendung von Interrupts:'''&lt;br /&gt;
* Es ist einfacher zu implementieren, da die Abfrage des Geräts im Hauptprogramm erfolgen kann.&lt;br /&gt;
* Es reagiert meist schneller auf das externe Ereignis. Bei Interrupts wird der aktuelle Befehl des Hauptprogramms noch fertig ausgeführt, dann wird die Rücksprungadresse gesichert und in die [[ISR]] verzweigt. Diese wiederrum muss die zu benutzenden Register auf dem Stack sichern, bevor sie mit der eigentlichen Reaktion auf das externe Ereignis beginnen kann. Beim Polling kann nach Erkennung des Ereignisses sofort reagiert werden.&lt;br /&gt;
* Es ist mehr Hardwareaufwand bei den Geräten notwendig, da diese in der Lage sein müssen, auf das Auftreten einer Änderung mit einer Interrupt-Anfrage zu reagieren. (so braucht z.B. ein Temperatursensor für Polling im einfachsten Fall nur einen A/D-Wandler, für die Verwendung von Interrupts muss er auf die Änderung der Temperatur zusätzlich mit einer Interruptanfrage reagieren können)&lt;br /&gt;
&lt;br /&gt;
'''Vorteile von Interrupts gegenüber Polling:'''&lt;br /&gt;
* Das Auftreten des externen Ereignisses wird immer überwacht. Beim Polling geschieht dies nur zu den Zeiten, zu denen das Hauptprogramm danach frägt.&lt;br /&gt;
* Das Hauptprogramm kann andere Aufgaben übernehmen als das externe Gerät zu überwachen. Beim Polling wird häufig sämtliche Rechenleistung für die Abfrage der Geräte aufgewendet.&lt;br /&gt;
* Die Kommunikationsleitungen, Datenbusse und externen Geräte werden entlastet. Im Gegensatz zum Polling wird nur mit dem Gerät kommuniziert, wenn tatsächlich ein externes Ereigniss stattfindet.&lt;br /&gt;
* Es ist oft stromsparender. Hat das Hauptprogramm keine Aufgaben mehr zu erledigen, so kann es Teile der CPU bis zum nächsten Auftreten eines Interrupts in einen stromsparenden Sleep-Mode versetzen. In diesem Modus wird die CPU angehalten und beim nächsten Interrupt wieder aktiviert. Fast alle modernen, interruptfähigen Prozessoren unterstützen einen solchen Modus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:2px solid #ffd700; margin-left:auto; margin-right:auto; padding:0.3em; text-align:left; &amp;quot;&amp;gt;&lt;br /&gt;
In den allermeisten Fällen überwiegen die Vorteile der Verwendung von Interrupts deutlich!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Interrupt-Sharing===&lt;br /&gt;
Stehen auf dem Controller weniger Interruptleitungen zur Verfügung, als interruptfähige Geräte angeschlossen werden sollen, so ist es notwendig, dass sich mehrere Geräte eine Interruptleitung teilen (Interrupt-Sharing). Bei einfachen Controllern kann es sogar vorkommen, dass nur eine einzige [[ISR]] definiert werden kann, die bei '''jeder Art''' von Ereignis aufgerufen wird.&lt;br /&gt;
In diesem Fall muss die durch den Interrupt aufgerufene [[ISR|Interrupt Service Routine]] prüfen, bei welchem Gerät das Ereignis aufgetreten ist. Das geschieht wiederrum durch Abfrage jedes in Frage kommenden Geräts (also Polling).&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[ISR]] &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Transistor&amp;diff=6382</id>
		<title>Transistor</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Transistor&amp;diff=6382"/>
				<updated>2006-03-06T20:11:35Z</updated>
		
		<summary type="html">&lt;p&gt;Johannuhrmann: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Transistor ist ein elektronisches Halbleiterbauelement. Man verwendet Transistoren zum Schalten und Verstärken. Die Bezeichnung Transistor ist eine Kurzform vom englischen ''Transfer Varistor'' und soll den Transistor als einen durch Strom steuerbaren Widerstand beschreiben. &lt;br /&gt;
Es wird in 2 Hauptgruppen unterschieden:&lt;br /&gt;
&lt;br /&gt;
Bipolare Transitoren und [[FET]]'s (Feldeffekttransistor)&lt;br /&gt;
&lt;br /&gt;
Bipolare Transistoren werden durch Stromfluss angesteuert. Die Anschlüsse des Bipolaren Transistors sind ''Kollektor'' , ''Basis'' und ''Emitter''. Ein kleiner Strom auf der Basis-Emitter-Strecke kann dabei einen großen Strom auf der Kollektor-Emitter-Strecke steuern. Es wird unter anderem auch zwischen NPN und PNP Transitoren unterschieden.&lt;br /&gt;
&lt;br /&gt;
Bei FET's werden die Anschlüsse als Gate (engl. Tor, Gatter), Drain (engl. Abfluss), Source (engl. Quelle) bezeichnet. Der Strom auf der Drain-Source-Strecke wird hier durch die Spannung zwischen Gate und Source gesteuert. Die Steuerung erfolgt (nahezu) stromlos.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Transistor.gif|center]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Grundschaltungen ==&lt;br /&gt;
===Die NOT Verknüpfung===&lt;br /&gt;
&lt;br /&gt;
[[Bild:NOT Gatter.JPG]]&lt;br /&gt;
&lt;br /&gt;
Diese einfache Schaltung, bestehend aus einem NPN Transistor und zwei Widerständen, invertiert das Eingangssignal, sodass aus beispielsweise +5V (oder logisch 1) 0V (oder logisch 0) erzeugt werden.&lt;br /&gt;
Die daraus resultierende Wertetabelle sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align = &amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 | '''Eingang'''&lt;br /&gt;
 | '''Ausgang'''&lt;br /&gt;
 |-&lt;br /&gt;
 | 0V&lt;br /&gt;
 | +5V&lt;br /&gt;
 |-&lt;br /&gt;
 | +5V&lt;br /&gt;
 | 0V&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Wenn also an der Transistorbasis +5V angelegt werden (+0,7V reichen meistens auch schon), dann schaltet der Transistor durch und am Ausgang liegen 0V an. Der Strom, der nun durch den Transistor fließt wird durch den Widerstand R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; begrenzt. Wird dieser Widerstand weggelassen, dann wird durch den entstehenden Kurzschluss der Transistor unweigerlich zerstört.&lt;br /&gt;
Legt man nun am Eingang 0V an, so sperrt der Transistor und am Ausgang liegen +5V an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Basisstrom wird durch den Widerstand R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; bestimmt. Ein kleiner Widerstand beschleunigt die Schaltgeschwindigkeit des Transistors, ein großer ermöglicht die Ansteuerung auch mit kleinen Strömen.&lt;br /&gt;
&lt;br /&gt;
===Die NAND Verknüpfung===&lt;br /&gt;
&lt;br /&gt;
[[Bild:NAND_Gatter.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die NAND ('''N'''ot'''AND''', d.h. die invertierte Form einer AND Verknüpfung) Verknüpfung besteht aus zwei Transistoren und damit auch zwei Eingängen. Es gibt auch NAND Verknüpfungen, mit mehr Transistoren und folglich auch mehr Eingängen, diese sind im Aufbau aber sehr ähnlich zu der vorgestellten Grund-NAND Verknüpfung.&lt;br /&gt;
Schauen wir uns zunächst die Wertetabelle an:&lt;br /&gt;
&amp;lt;div align = &amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 | '''Eingang 1 (E1)'''&lt;br /&gt;
 | '''Eingang 2 (E2)'''&lt;br /&gt;
 | '''Ausgang (A1)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |   0V&lt;br /&gt;
 |   0V&lt;br /&gt;
 |  +5V&lt;br /&gt;
 |-&lt;br /&gt;
 |  +5V&lt;br /&gt;
 |   0V&lt;br /&gt;
 |  +5V&lt;br /&gt;
 |-&lt;br /&gt;
 |   0V&lt;br /&gt;
 |  +5V&lt;br /&gt;
 |  +5V&lt;br /&gt;
 |-&lt;br /&gt;
 | +5V&lt;br /&gt;
 | +5V&lt;br /&gt;
 | 0V&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie kommt es nun zu dieser Werte- oder auch Wahrheitstabelle?&lt;br /&gt;
&lt;br /&gt;
Wenn an den beiden Eingängen 0V anliegen, dann schaltet keiner der beiden Transistoren durch und der Ausgang ist über den Widerstand R&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; mit +5V verbunden.&lt;br /&gt;
Wechselt nun einer der beiden Eingänge auf 1, dann schaltet auch nur einer der beiden Transistoren durch und am Ausgang liegen immer noch +5V an. Werden nun aber beide Eingänge mit +5V verbunden, dann schalten beide Transistoren durch und der Ausgang ist leitend mit Masse verbunden.&lt;br /&gt;
&lt;br /&gt;
Die Widerstände (R&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, R&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, R&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;) haben die gleiche Funktion wie auch in der NOT Verknüpfung.&lt;br /&gt;
&lt;br /&gt;
== Transistor - Kennwerte ==&lt;br /&gt;
Die Transistorkennwerte sind grundsätztlich in Grenzdaten und Kenndaten unterteilt. Grenzwerte dürfen auf keinen Fall überschritten werden, da eine Zerstörung des Transistors unvermeidlich ist. Eigenschaften eines Transistors werden als Kenndaten angegeben, die das Verhalten in bestimmten Arbeitspunkten kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Grenzwerte für Sperrschichttemperatur==&lt;br /&gt;
Durch die Verlustleistung bei Dauerbetrieb entsteht in der Sperrschicht Wärme, durch die sich die Sperrschichttemperatur erhöht, diese Sperrschichttemperatur '''T&amp;lt;sub&amp;gt;J&amp;lt;/sub&amp;gt; ''' , darf bestimmte Werte nicht überschreiten, da die Halbleitereigenschaften des Transistors stark verändert würden, was die Zerstörung zur Folge hat. Diese Temperatur hängt vom Halbleitermaterial ab.&lt;br /&gt;
&lt;br /&gt;
'''T&amp;lt;sub&amp;gt;J&amp;lt;/sub&amp;gt; ''' : 90°C Germaniumtransistoren&lt;br /&gt;
&lt;br /&gt;
'''T&amp;lt;sub&amp;gt;J&amp;lt;/sub&amp;gt; ''' : 150 - 200°C Siliziumtransistoren&lt;br /&gt;
&lt;br /&gt;
==Grenzwerte für Umgebungstemperatur==&lt;br /&gt;
Einige Hersteller geben statt der maximalen Sperrschichttemperatur die höchstzulässige Umgebungstemperatur '''T&amp;lt;sub&amp;gt;U&amp;lt;/sub&amp;gt; ''' als Grenzwert an. '''T&amp;lt;sub&amp;gt;U&amp;lt;/sub&amp;gt; ''' ist stets kleiner als '''T&amp;lt;sub&amp;gt;J&amp;lt;/sub&amp;gt; '''. Zu diesen beiden Angaben ist in den Datenblättern meistens ein Diagramm zu finden in dem die Temperaturabhängigkeit der höchstzulässigen Gesamtverlustleistung  aufgezeigt wird. Aus diesem Diagramm kann die Verlustleistung bei bestimmten Umgebungstemperaturen entnommen werden. Als Parameter ist der Wärmewiederstand '''R&amp;lt;sub&amp;gt;Th&amp;lt;/sub&amp;gt; ''' des Halbleiters aufgetragen. Denn wird durch einen Kühlkörper oder durch die Montage des Transistors an einem Gehäuse die Wärme besser abgeführt, so ist die Gesamtverlustleistung auch bei höheren Umgebungstemperaturen zulässig.&lt;br /&gt;
&lt;br /&gt;
==Zulässiger Arbeitsbereich==&lt;br /&gt;
In Transistorschaltungen dürfen bestimmte Grenzwerte nicht überschritten werden. Der zulässige Arbeitsbereich einer Transistorschaltung wird somit durch den Kollektorstrom '''I&amp;lt;sub&amp;gt;c&amp;lt;/sub&amp;gt; ''', durch die Kollektor - Emitterspannung '''U&amp;lt;sub&amp;gt;CE&amp;lt;/sub&amp;gt; ''' und durch die Verlustleistung '''P&amp;lt;sub&amp;gt;tot&amp;lt;/sub&amp;gt; ''' begrenzt. Wird der Transistor außerhalb des erlaubten Arbeitsbereiches betrieben wird der Transistor zerstört.&lt;br /&gt;
&lt;br /&gt;
''Autor: ZwieBack - Wiki Konvertierung Frank''&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Feldeffekttransistor|FET]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Johannuhrmann</name></author>	</entry>

	</feed>