Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

1

20.05.2014, 18:50

Problem mit dem Dereferenzierungsoperator

Hi, ich bin neu im Forum und schlage mich jetzt schon zu lange mit meinem Unverständnis im Bezug auf Zeiger rum:).
So jetzt zu meiner Frage/Fragen...
Wenn eine Funktion einen Zeiger in der Parameterliste hat wird doch normalerweise beim Aufruf dieser Funktion eine Adresse einer Variable erwartet.
Das würde dann so aussehen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
// Funktionsprototyp
//
void Function(int *pPointer);


// Aufruf der Funktion
//
Function(&Variable);      // Hier wird die Adresse der Variable übergeben und jetzt habe ich in der Funktion Zugriff auf auf den Speicherbereich an dem Sie steht


Das leuchtet mir ein.
Was mir weniger einleuchtet ist die Tatsache, nehmen wir als Beispiel die Logfile-Klasse aus dem Buch, das dort einfach ein String übergeben wird, obwohl
im Funktionsprototyp ein Zeiger als Parameter angegeben ist.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// Funktionsprototyp
//
void Textout(const char *Text);


// Aufruf der Funktion
//
Textout(buffer);                             // Hier wird einfach nur eine char-Variable übergeben, jedoch nicht die Adresse sondern der Wert
Textout("<font color=black>");       // Hier im Grunde das gleiche


Jetzt frage ich mich wie das gehen kann bzw was für eine Logik dahintersteckt.
Danke im Voraus für hilfreiche Antworten:)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

20.05.2014, 18:58

Ein hart kodierter C-String ist nichts weiter als ein Array von einzelnen Zeichen. Also ein char[]. Allerdings existiert bei Parametern kein Unterschied zwischen einem Array und einem Pointer auf sein erstes Element (es ist letztlich beides die Startadresse von multiplen hintereinander abgelegten Werten desselben Datentyps). Daher ist das äquivalent und man kann auf Speicher-Elemente über einen Pointer genau wie auf Arrays per [] zugreifen. So funktionieren letztlich Strings in C: char*. Ein std::string ist wieder was ganz anderes. Der kann natürlich nicht einfach so als char* Paramter übergeben werden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

3

20.05.2014, 19:27

Ok, danke ich denke ich hab es verstanden.
d.h wenn ich die Funktion jetzt so definiert hätte:

C-/C++-Quelltext

1
void Textout(const char Text)

könnte ich nur ein einzelnes Zeichen übergeben
und so:

C-/C++-Quelltext

1
void Textout(const char *Text)

habe ich praktisch ein Array, da das erste Zeichen den Anfang des Speicherbereiches markiert und alle weiteren Zeichen dahintergehängt werden?

4

20.05.2014, 20:03

Stimmt genau. Wie BlueCobold schon sagte: Du kannst auch ein Array als Zeiger übergeben, sofern Zeiger und Array vom gleichen Typ sind. Du kannst allerdings auch etwas anstellen, wie das hier:

C-/C++-Quelltext

1
2
const char* string; // <- Irgendein string.
Textout(&string[1]);


Damit würdest du einen Zeiger auf das zweite Element des Arrays übergeben. Was ich damit sagen will, ist, dass du nicht immer davon ausgehen kannst, bei einem Zeiger wirklich einen solchen auf das erste Element eines Arrays übergeben zu bekommen. Es kann auch sein, dass man dir einen Zeiger auf ein anderes Element, oder sogar auf gar kein Array sondern auf ein einzelnes Objekt gibt.

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

5

20.05.2014, 20:23

Alles Klar, vielen Dank :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

20.05.2014, 22:01

Klar, es ist Interpretations-Sache der Funktion den char* richtig zu deuten. Steckt dahinter ein Array oder ist es nur ein Pointer auf einen einzelnen Char? Das macht die Sache mit C-Arrays und C-Strings schnell sehr hässlich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

7

22.05.2014, 19:43

Wann braucht man aber einen Pointer auf einen Char?
Für pass by reference kann man Referenzen nehmen und ein char ist wirklich nicht so groß, dass man dafür einen globalen Zeiger oder sowas braucht, wie z.B. bei komplexen physikalischen Objekten, die nur einmal im Speicher existieren sollten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

22.05.2014, 21:06

Irgendwo wird es schon mal eine Methode/Funktion geben, die eine optionale Referenz benötigt und die geht nur per Pointer (da null-Referenzen GANZ übles Teufelszeug sind).
Wahlweise Datenstrukturen, die eben chars auf dem Heap erzeugen müssen. Da wird man für solche Situationen schon irgendwo mal einen Anwendungsfall haben.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige