Zum Inhalt springen

Zeiger / Pointer - warum so oft?


lumpie

Empfohlene Beiträge

Hallo,

habe mal eine kleine Frage...

Und zwar fällt mir auf das die Funktionen aus der MFC von Microsoft oder auch andere Softwarehersteller viel Zeiger verwenden.

Was Zeiger sind (Verweise auf anderen Variablen und deren Inhalt) ist mir klar.

Natürlich auch das es mit Zeigern möglich ist dynamisch Speicher zu allockieren.

ABER:

Warum verwendet man in für einfachste Funktionen sogar Zeiger?

Und was bedeutet es z.B. wenn eine Variable so aussieht:


char **Message;
[/PHP]

Ist das dann ein Zeiger auf einen anderen Zeiger?? :eek

In den ganzen Programmen die ich bisher geschrieben habe, verwendete ich die Zeiger nur um mit new mir neue Klasseninstanzen dynamisch zu erzeugen oder wie gesagt um dynamisch Speicher zu allockieren da manche Schnittestellen dies forderten...

Sollte ich meine Programmierung überdenken, da ich relativ wenig Zeiger einsetze und alles über lokale Variablen und Rückgabewerte in Methoden abhandle ?? oder wieso macht man das?

Und noch ein anderes - ich habe nun folgendes Stück Code gefunden:

[PHP]
int getsurfval_method (Value)
char *Value;

Warum definieren die Jungs den Zeiger Value nicht gleich in der Klammer? Hat das irgendwelche Vorteile?

EDIT:

Ein Grund ist mir eben eingefallen, werden so oft Zeiger verwendet um weniger Variablen und damit weniger reservierten Speicher zu verbrauchen?

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum verwendet man in für einfachste Funktionen sogar Zeiger?
Die MFC sind schon sehr alt, die ersten Versionen sind älter als der C++-Standard. Die MFC benutzen auch nirgendwo Referenzen (AFAIK). Daher ist die einzige Möglichkeit, wie eine MFC-Funktion einen ihrer Parameter ändern kann, die, statt dessen einen Zeiger zu übergeben.

Dazu kommt, dass die MFC immer noch jede Menge mit C-Strings und roher Speicherpuffern macht. Da geht es nicht ohne Zeiger.

Und was bedeutet es z.B. wenn eine Variable so aussieht:


char **Message;
[/PHP]

Ist das dann ein Zeiger auf einen anderen Zeiger?? :eek

Ja. Allerdings ist char da immer ein Sonderfall. In Ermangelung eines eingebauten Datentyps für Strings bedient man sich in C eines Zeigers auf char, der auf den Anfang einer Zeichenkette verweist. Das Ende wird durch ein bestimmtes Terminierungszeichen markiert.

Welchen Zweck dieser Doppelzeiger genau hat, lässt sich ohne Kontext nicht sagen.

Sollte ich meine Programmierung überdenken, da ich relativ wenig Zeiger einsetze und alles über lokale Variablen und Rückgabewerte in Methoden abhandle ??
Auf keinen Fall. Zeiger sollte man nur dort einsetzen, wo sie auch geeignet sind. Wenn du keine Zeiger brauchst, kannst du dich glücklich schätzen.

Und noch ein anderes - ich habe nun folgendes Stück Code gefunden:

[PHP]
int getsurfval_method (Value)
char *Value;

Warum definieren die Jungs den Zeiger Value nicht gleich in der Klammer? Hat das irgendwelche Vorteile?

Das ist die (ältere) K&R-Schreibweise, aus Kompatibilitätsgründen im ANSI-C-Standard enthalten.

Ein Grund ist mir eben eingefallen, werden so oft Zeiger verwendet um weniger Variablen und damit weniger reservierten Speicher zu verbrauchen?
Nein. Prinzipiell verbrauchen Zeiger zusätzlich Speicher.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Klotzkopp :byby:

danke für deine Antwort einiges ist mir jetzt klar geworden aber bei 2 punkten habe ich noch nicht so ganz den Durchblick.

Ja. Allerdings ist char da immer ein Sonderfall. In Ermangelung eines eingebauten Datentyps für Strings bedient man sich in C eines Zeigers auf char, der auf den Anfang einer Zeichenkette verweist. Das Ende wird durch ein bestimmtes Terminierungszeichen markiert.

Welchen Zweck dieser Doppelzeiger genau hat, lässt sich ohne Kontext nicht sagen.

Den Kontext kann ich dir leider nicht geben, da eine Schnittstelle im LINUX/UNIX diese Übergabeparameter hat.

Sprich die Function bekommt **Message übergeben und ich kann dann hier meinen Nachrichtentext einstellen und dieser wird dann von LINUX/UNIX verarbeitet... Welcher Code genau dahinter liegt (also aus welcher Methode/Funktion) dann meine Funktion aufgerufen wird kann ich dir leider nicht sagen.

Nein. Prinzipiell verbrauchen Zeiger zusätzlich Speicher.

hmm wieso das?

Ich denke Zeiger sind nur Verweise/Links auf einen Speicherbereich.

Wenn ich z.B. eine int Variable deklariere dann wird doch automatisch Speicherplatz für die Varaible reserviert (= verbraucht).

Wenn ich nun meine Variable aber durch den Zeiger ändere brauche ich keine Zusätzliche Hilfsvariable in einer Unterfunktion oder?

Oder sehe ich da etwas falsch?

Danke! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Den Kontext kann ich dir leider nicht geben, da eine Schnittstelle im LINUX/UNIX diese Übergabeparameter hat.

Sprich die Function bekommt **Message übergeben und ich kann dann hier meinen Nachrichtentext einstellen und dieser wird dann von LINUX/UNIX verarbeitet...

Der Kontext muss sich dann aus der Dokumentation dieser Schnittstelle ergeben. Dort muss z.B. stehen, ob du diesen Zeiger auf selbst allokierten Speicher setzen musst und wie dieser Speicher organisiert sein muss.

hmm wieso das?

Ich denke Zeiger sind nur Verweise/Links auf einen Speicherbereich.

Wenn ich z.B. eine int Variable deklariere dann wird doch automatisch Speicherplatz für die Varaible reserviert (= verbraucht).

Für einen Zeiger wird auch Speicher reserviert. Ein Zeiger allein bringt dir aber nichts. Damit du mit einem Zeiger etwas anfangen kannst, muss er auf eine existierende Variable zeigen.

Wenn ich nun meine Variable aber durch den Zeiger ändere brauche ich keine Zusätzliche Hilfsvariable in einer Unterfunktion oder?

Oder sehe ich da etwas falsch?

Mir ist nicht klar, wovon du da redest. Was für eine "Unterfunktion"?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Kontext muss sich dann aus der Dokumentation dieser Schnittstelle ergeben. Dort muss z.B. stehen, ob du diesen Zeiger auf selbst allokierten Speicher setzen musst und wie dieser Speicher organisiert sein muss.

**Message

Specifies the address of a pointer to malloc'ed memory containing an NLS error message. The method is expected to supply the malloc'ed memory and the message.

Ich habe den Code ja schon und er funktioniert aber ich mich hat interessiert ob das char **Message eine besondere Bedeutung hat :)

Für einen Zeiger wird auch Speicher reserviert. Ein Zeiger allein bringt dir aber nichts. Damit du mit einem Zeiger etwas anfangen kannst, muss er auf eine existierende Variable zeigen.

Ja das ist mir schon klar :beagolisc

Mir ist nicht klar, wovon du da redest. Was für eine "Unterfunktion"?

Ich meinte, wenn ich eine Funktion oder Methode habe die als Übergabeparameter eine Integer Variable hat.

Ein Beispiel:



void func_one(int int_func_test)
{
int func = 0;
int func = 2 + int_func_test;
}

void main()
{
int int_test = 1;
func_one(int_test);
}
[/PHP]

Hier wird doch einmal für int_test , int_func_test und func Speicher reserviert.

Aber ich könnte mir z.B. die Reservierung für int_func_test sparen wenn ich mit Zeigern arbeiten würde denn dann würde ich den Zeiger an die Funktion übergeben und somit auf einen bestehenden Adressbereich für int_test verweisen?

Oder sind in solchen Fällen die Reservierungen von Zeigern und int Werten gleich groß? Lohnt es sich bei großen char Feldern? (btw. was ist das Terminierungszeichen für char Zeiger und hat man mit einen Char Zeiger auch eine Begrenzung an Zeichen?)

Danke :nett:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe den Code ja schon und er funktioniert aber ich mich hat interessiert ob das char **Message eine besondere Bedeutung hat :)
Wie gesagt, für sich allein nicht.

Hier wird doch einmal für int_test , int_func_test und func Speicher reserviert.

Aber ich könnte mir z.B. die Reservierung für int_func_test sparen wenn ich mit Zeigern arbeiten würde denn dann würde ich den Zeiger an die Funktion übergeben und somit auf einen bestehenden Adressbereich für int_test verweisen?

Das könntest du. Aber erstens ist ein Zeiger auf einem 32Bit-System 4 Byte groß, und ein int meist auch. Zweitens, und das ist wichtiger, hättest du eine ganz andere Funktion. So, wie sie jetzt ist, hast du keine Möglichkeit, durch Zuweisungen an int_func_test die Variable int_test zu ändern. Mit einem Zeiger wäre das möglich. Daher sind die Fälle gar nicht vergleichbar.

Lohnt es sich bei großen char Feldern?
Felder (Arrays) werden bei Funktionsaufrufen sowieso nicht kopiert. Allgemein kann es sich lohnen, wenn man beim Funktionsaufruf das Kopieren der Parameter verhindert. Das macht man aber in C++ üblicherweise nicht mit Zeigern, sondern mit konstanten Referenzen.

(btw. was ist das Terminierungszeichen für char Zeiger und hat man mit einen Char Zeiger auch eine Begrenzung an Zeichen?)
Das Terminierungszeichen ist das Nullzeichen ('\0'). Bei Literalen wird es automisch hinzugefügt. Bei Stringfunktionen steht es in der Dokumentation. Eine Begrenzung gibt es prinzipiell nur durch den verfügbaren (virtuellen) Speicher.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...