Anfängerfragen ;-)
-
Hallo Leute
Erst mal.... Schön bei euch zu sein. Mich hat die Lust aufs programmieren gepackt. Ich sitze in meiner Freizeit eh dauernd vorm Rechner. Da war es halt nur ne Frage der Zeit, mich auch mit den Dingen zu befassen, die hinter der Fassade ablaufen. Was steckt hinter diesen .exe Dateien, die man als reiner User täglich ausführt ohne einen Gedanken daran zu verschwenden, was Programme eigentlich sind?So befasste ich mich also mit C mittels Büchern und Online Tutorials. Aber weder Bücher noch Online Tutorials führen Dialoge über ungeklärte Fragen. Ich bin gerade beim Thema Zeiger und Zeigerarithmetik, der wohl komplexesten Thematik dieser Sprache. Und ich würde den Sinn und Zweck in Bezug auf Speicherbedarf und Performance gerne wirklich verstehen. Compiler Dev C++.
Frage 1: Ein Zeiger kann nicht arbeiten ohne dass eine Variable erstellt wird, auf die er zeigen soll. Also wird die Variable deklariert und zusätzlich noch der dazugehörige Zeiger, der ebenfalls noch mal Speicher frisst. Ist dann also der Speicherbedarf nicht höher, als wenn man ausschließlich mit den Variablen selbst arbeiten würde?
Frage 2: Rein logisch erscheint einem der Performancezuwachs, wenn bei Wertübergaben an Funktionen nur die Zeiger übergeben werden und dann in der Nebenfunktion einfach nur die Werte innerhalb der Speicheradressen verändert werden. Das erspart die Rückgabe per return. Bedeutet das, dass man sich später, wenn man nur noch mit Zeigern hantiert, jegliche returns in Funktionen sparen kann? Dass Rückgaben per return quasi von direkten Speicherzugriffen abgelöst werden?
Frage 3: wird im fortgeschrittenen Zeiten wirklich nur noch mit Zeigern gearbeitet? Also wirklich von jeder kleinen Zählervariablen nen Zeiger erstellt und auch innerhalb von main und allen Nebenfunktionen nur noch mit Zeigern hantiert wird. Bei welchen Aktionen beim programmieren machen Zeiger wirklich Sinn und wo nicht? Bisher erscheint es mir nur bei Funktionsübergreifenden Aktionen performancetechnisch sinnvoll zu sein.
Frage 4: Von wem wird C verwaltet? Angenommen C bzw. C++ bekommt einen neuen Standard verpasst, neue Schlüsselwörter und Syntax werden eingeführt....... Wie erfährt man davon? Gibt es ein offizielles Portal im Netz seitens der C Entwickler, über das man auf dem Laufenden gehalten wird?
Ich danke schon mal vielmals im Voraus!
-
Davidbee schrieb:
Frage 1: Ein Zeiger kann nicht arbeiten ohne dass eine Variable erstellt wird, auf die er zeigen soll.
Nö.
int * a = 0;
Ich habe keine Variable erstellt und zeige auf 0.
Ein Zeiger selber braucht auf einer 32Bit Architektur 32 Bit und auf einer 64Bit Architektur entsprechend doppelt so viel.
Davidbee schrieb:
Bedeutet das, dass man sich später, wenn man nur noch mit Zeigern hantiert, jegliche returns in Funktionen sparen kann?
Jein... Es gibt eh nicht viele Funktionen, die größere Datenmengen zurückgeben müssten. Viele Funktionen geben z.B. nur einen Wert zurück, wie strlen. Oder die machen was und geben einen Statuswert zurück. Also, um Rückgabewerte kommst du nicht drum rum. Und dann gibts noch Funktionen, die einen Zeiger auf eine Datenstruktur reinbekommen. Das ist halt Objektorientierung in C. z.B. eine Struktur bitmap und eine Funktion set_bitmap_width(bitmap*, int); Die einzige Funktion in dem Zusammenhang, die Daten zurückgeben müsste, wäre ein Konstruktor create_bitmap, der wird dann schon einen Zeiger zurückgeben.
Davidbee schrieb:
wird im fortgeschrittenen Zeiten wirklich nur noch mit Zeigern gearbeitet? Also wirklich von jeder kleinen Zählervariablen nen Zeiger erstellt und auch innerhalb von main und allen Nebenfunktionen nur noch mit Zeigern hantiert wird.
Nee, das macht überhaupt keinen. Mal ne Gegenfrage in dem Zusammenhang, warum machst du überhaupt C? Mach einfach C++ und vergiss Zeiger wieder
-
Mechanics schrieb:
Davidbee schrieb:
wird im fortgeschrittenen Zeiten wirklich nur noch mit Zeigern gearbeitet? Also wirklich von jeder kleinen Zählervariablen nen Zeiger erstellt und auch innerhalb von main und allen Nebenfunktionen nur noch mit Zeigern hantiert wird.
Nee, das macht überhaupt keinen.
Das beschriebene Szenario ist das Bild, das C-Programmierer von Java haben
.
@Fragesteller: Bei deinen Fragen vergisst du anscheinend, dass ein Zugriff über einen Zeiger eine Indirektion darstellt. Erst muss man den Zeiger holen und auswerten, erst dann kommt man an das Objekt, das einen eigentlich interessiert. Zeiger machen einfache Aktionen nicht schneller, sondern langsamer. Man spart sich nur dann Zeit, wenn man durch die Indirektion Arbeit vermeidet, zum Beispiel wenn man statt eines großen Objekts bloß einen Zeiger darauf kopiert, wenn man von mehreren Stellen Zugriff auf das Objekt möchte. (Das ist aber nicht der einzige Grund für Zeiger, sondern eher ein angenehmer Nebeneffekt)
Davidbee schrieb:
Frage 4: Von wem wird C verwaltet? Angenommen C bzw. C++ bekommt einen neuen Standard verpasst, neue Schlüsselwörter und Syntax werden eingeführt....... Wie erfährt man davon? Gibt es ein offizielles Portal im Netz seitens der C Entwickler, über das man auf dem Laufenden gehalten wird?
C und C++ sind internationale Standards, die offiziell von der Internationalen Standard Organisation (ISO) verwaltet werden. Aber den letztlich von der ISO veröffentlichten Standard liest kaum ein Mensch (der kostet viel Geld), bestenfalls die (frei zugänglichen) Vorentwürfe. Von neuen Entwicklungen erfährt man zum Beispiel auf den Seiten der Arbeitsgruppen, die an den neuen Standards arbeiten. Oder - was für den Normalsterblichen wohl verständlicher ist - auf entsprechenden Communityseiten, die den zuvor genannten Inhalt etwas verständlicher präsentieren.
Das kann unter anderem dieses Forum hier sein.
-
[quote="Mechanics"]
Davidbee schrieb:
Mal ne Gegenfrage in dem Zusammenhang, warum machst du überhaupt C? Mach einfach C++ und vergiss Zeiger wieder
Wie jetzt? C++ soll doch noch viel anspruchsvoller als C sein. Darum wollt ich "klein" anfangen. Gibbet in C++ etwa keine Zeiger mehr?
-
Davidbee schrieb:
Wie jetzt? C++ soll doch noch viel anspruchsvoller als C sein. Darum wollt ich "klein" anfangen. Gibbet in C++ etwa keine Zeiger mehr?
Wissen über C wird dir in C++ nichts bringen, C ist kein kleines C++. Daher ist das eine komische Entscheidung, zuerst C zu lernen, wenn man C++ machen möchte. So etwas wie Zeiger gibt es natürlich auch in C++ (Eine Programmiersprache muss so etwas wie Zeiger unterstützen, wenn man komplexe Datenstrukturen bauen möchte. Und ohne komplexe Datenstrukturen kommt man nicht aus), aber die Sprachphilosophie hinter ihrem Einsatz ist ganz anders. Wenn du zuerst die C-Philosophie verinnerlichst und dann zu C++ wechselst, dann ist das sogar hinderlich, weil es schwer ist, Dinge wieder zu verlernen und du dann C in C++ programmieren würdest, was nicht lange gut geht.
Was du machen kannst ist, eine spezielle Lehrsprache zu lernen. C und C++ richten sich beide an Profiprogrammierer und nicht an Programmieranfänger.
-
Davidbee schrieb:
Wie jetzt? C++ soll doch noch viel anspruchsvoller als C sein.
Ach was! C ist von Profis für Profis entwickelt, C++ nicht!
http://www.c-plusplus.net/forum/326897-10#2408411SeppJ schrieb:
C wird dir in C++ nichts bringen
Das finde ich nicht. Mir hatte das eine Menge gebracht und die C++ Programmierer, die auch C können gehen in C++ meist sparsamer mit Ressourcen um!
MfG
-
SeppJ schrieb:
Was du machen kannst ist, eine spezielle Lehrsprache zu lernen. C und C++ richten sich beide an Profiprogrammierer und nicht an Programmieranfänger.
Vor ca 10 Jahren hat mir nen damaliger guter Freund mal das Programmieren nahegelegt und mich in Javascript als Einstieg eingeführt. Ich war auch ne ganze Zeit eifrig dabei, bis ich auch dies wie so vieles andere zuvor aus Zeitgründen meinem Job opfern musste. C habe ich gewählt, weil Webbrowser Programme für mich auf Dauer nicht interessant sind. "richtiges" Java war zwar Reizvoll, jedoch störte mich, dass Java Programme von Interpretern bzw der Runtime abgängig sind, die im Hintergrund mitlaufen muss. So landete ich schlißlich bei C. Ist ne Herausforderung, keine Frage. Aber sicher nicht unschaffbar. Die Frage, die sich nach der Klarstellung dessen, dass C kein kleines C++ sondern ganz was anderes ist stellt, ist die, ob ich nicht gleich mit C++ hätte anfangen sollen
-
Wenn du bereits etwas Erfahrung mit Programmierung hast, solltest du mit beidem klarkommen. Die Entscheidung sollte sich wohl ein danach richten, warum du Programmieren lernst und was du später so vor hast.
Außerdem scheinst du irgendwie lauter Programmiermythen ausgesetzt zu sein. Deine Aussagen über verschiedene Programmiersprachen sind zwar technisch gesehen korrekt, gehen aber allesamt irgendwie am Kern der Sache vorbei. Ja, C++ enthält technisch gesehen C (oder einen sehr großen Teil davon) und daher ist C ein kleines C++. Aber die Philosophie der beiden Sprachen ist so unterschiedlich, dass man in C++ fast nie Kontakt zu dem C-Teil hat, weswegen ich den Bezug so stark verneint habe. Java braucht eine Laufzeitumgebung und wird interpretiert. Auch das ist technisch gesehen richtig. Aber auch viele C- und C++-Programme brauchen eine Laufzeitumgebung, der Unterschied ist bloß, dass man, wenn man sich sehr einschränkt, auch ohne auskommt und daher theoretisch auch einen Toaster programmieren könnte. Das ginge mit Java nicht. Aber will man das? Auch die Interpretation von Java-Bytecode hat nicht mehr wirklich viel mit den Basicinterpretern der 1980er zu tun und man sollte nicht von diesen auf Java schließen, auch wenn es technisch gesehen noch ein paar oberflächliche Gemeinsamkeiten gibt.
Deine Vorstellungen über Zeiger sind ähnlich.
-
Davidbee schrieb:
Compiler Dev C++.
Nur als Hinweis: Dev-C++ ist eine veraltete IDE und kein Compiler.