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

11

21.06.2010, 15:36

Müsste er dann nicht auch den * verwenden ... Den Braucht man doch, um einen Zeiger zu erstellen?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

12

21.06.2010, 15:49

Man kann den Index Operator auch bei Zeigern verwenden. a[x] ist nichts anderes als *(a+x). Insbesondere ist also a[0] das gleiche wie *a, was dem dereferenzieren entspricht. Zudem ist ein Array nicht nur Prinzipiell ein Zeiger. Ein Array ist ein Zeiger, der direkt auf die Anfangsadresse eines entsprechend der Arraygröße reservierten Speicherbereiches zeigt. Mit einem Zeiger alleine ist halt kein Speicherbereich verbunden.

Das Problem bei dem Code im Eröffnungspost ist, dass der Zeiger auf die Adresse der Konstanten zeigt. Diese werden in der Executabel in einem extra Data Bereich gespeichert und vom Betriebssystem natürlich auch in den Speicher geladen. Allerdings werden Speicherbereiche in denen Programmcode und Daten stehen meist aus Sicherheitsgründen auf read only gesetzt. Hat man ein Betriebsystem ohne Speicherschutz, oder schreibt man selber ein Betriebsystem, ist das Vorgehen durchaus möglich.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

21.06.2010, 15:50

bei arrays wird das sternchen durch den index-operator ersetzt.
wie hast du c++ gelernt? in jedem guten buch wird das eigentlich erklärt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

14

21.06.2010, 15:55

Ich bin nicht an sprintf_s gebunden, mein Problem war nur, dass ich für die Funktion eine char* erwartet, und ich es mit static_cast nicht geschafft hab, die int - Variable umzuwandeln.

_itoa_s
boost::lexical_cast
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

15

21.06.2010, 16:26

bei arrays wird das sternchen durch den index-operator ersetzt.
wie hast du c++ gelernt? in jedem guten buch wird das eigentlich erklärt.
Ich hab C++ durch das Buch gelernt und C kenn ich noch ein wenig vom letzten Jahr in der HTL. Im Buch hab ich es offensichtlich nicht ganz mitbekommen oder verstanden ;)

Man kann den Index Operator auch bei Zeigern verwenden. a[x] ist nichts anderes als *(a+x). Insbesondere ist also a[0] das gleiche wie *a, was dem dereferenzieren entspricht. Zudem ist ein Array nicht nur Prinzipiell ein Zeiger. Ein Array ist ein Zeiger, der direkt auf die Anfangsadresse eines entsprechend der Arraygröße reservierten Speicherbereiches zeigt. Mit einem Zeiger alleine ist halt kein Speicherbereich verbunden.
Das Problem bei dem Code im Eröffnungspost ist, dass der Zeiger auf die Adresse der Konstanten zeigt. Diese werden in der Executabel in einem extra Data Bereich gespeichert und vom Betriebssystem natürlich auch in den Speicher geladen. Allerdings werden Speicherbereiche in denen Programmcode und Daten stehen meist aus Sicherheitsgründen auf read only gesetzt. Hat man ein Betriebsystem ohne Speicherschutz, oder schreibt man selber ein Betriebsystem, ist das Vorgehen durchaus möglich.
das chararray von David_pb ist im grunde auch nur ein zeiger, mit dem unterschied, dass du den index-operator( [] ) drauf anwenden kannst.
Vielen Dank für eure Erklärungen :D Jetzt hats bei mir klick gemacht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

21.06.2010, 16:34

Zudem ist ein Array nicht nur Prinzipiell ein Zeiger. Ein Array ist ein Zeiger, der direkt auf die Anfangsadresse eines entsprechend der Arraygröße reservierten Speicherbereiches zeigt. Mit einem Zeiger alleine ist halt kein Speicherbereich verbunden.

Achtung, ein Array ist nicht einfach nur ein Zeiger auf das erste Element! Ein Array ist ein Array, es existiert lediglich eine implizite Konvertierung von einem Array in einen Zeiger auf sein erstes Element.

Wers nicht glaubt soll einfach mal folgendes probieren

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int main()
{
  int  a[42];
  int* b = a;

  cout << sizeof(a) << endl;
  cout << sizeof(b) << endl;
}



bei arrays wird das sternchen durch den index-operator ersetzt.
wie hast du c++ gelernt? in jedem guten buch wird das eigentlich erklärt.

Es wird nicht einfach irgendwas ersetzt. Wie schon Tobiking gesagt hat kannst du den [] Operator genauso in Verbindug mit Pointern nutzen wie den Dereferezierungsoperator (*) in Zusammenhang mit Arrays...

Das Problem bei dem Code im Eröffnungspost ist, dass der Zeiger auf die Adresse der Konstanten zeigt. Diese werden in der Executabel in einem extra Data Bereich gespeichert und vom Betriebssystem natürlich auch in den Speicher geladen.

Abgesehen davon dass man String Literale nicht verändern darf ist das Problem, wie schon weiter oben gesagt wurde, vor allem auch dass die übergebene Buffergröße nicht mit der tatsächlichen Größe übereinstimmt...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (21.06.2010, 17:01)


17

21.06.2010, 17:05

Achtung, ein Array ist nicht einfach nur ein Zeiger auf das erste Element! Ein Array ist ein Array, es existiert lediglich eine implizite Konvertierung von einem Array in einen Zeiger auf sein erstes Element.


Also wenn ich ein Normales Char - Array habe kann ich dass einfach so einem Pointer übergeben, weil der die Adresse des Ersten Speicherplatztes im Array "übernimmt" ?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

21.06.2010, 17:08

Achtung, ein Array ist nicht einfach nur ein Zeiger auf das erste Element! Ein Array ist ein Array, es existiert lediglich eine implizite Konvertierung von einem Array in einen Zeiger auf sein erstes Element.


Also wenn ich ein Normales Char - Array habe kann ich dass einfach so einem Pointer übergeben, weil der die Adresse des Ersten Speicherplatztes im Array "übernimmt" ?


Ja, weil hier ein impliziter Cast zu char* stattfindet.
@D13_Dreinig

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

21.06.2010, 17:13

Es wird nicht einfach irgendwas ersetzt. Wie schon Tobiking gesagt hat kannst du den [] Operator genauso in Verbindug mit Pointern nutzen wie den Dereferezierungsoperator (*) in Zusammenhang mit Arrays...


ja, das war unglücklich ausgedrückt. im grunde meinte ich mit meinem ersten post was du hier gemeint hast:

Zitat

Achtung, ein Array ist nicht einfach nur ein Zeiger auf das erste Element! Ein Array ist ein Array, es existiert lediglich eine implizite Konvertierung von einem Array in einen Zeiger auf sein erstes Element.


@Ombalat: ja du kannst das array an eine funktion übergeben um die daten im array zu ändern oder es einfach aus zu lesen ohne kopieren zu müssen. so machts ja auch die funktion sprintf_s.
dabei solltest du aber beachten was dabei raus kommt:

Zitat

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int main()
{
  int  a[42];
  int* b = a;

  cout << sizeof(a) << endl;
  cout << sizeof(b) << endl;
}
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

20

21.06.2010, 17:34

@Ombalat: ja du kannst das array an eine funktion übergeben um die daten im array zu ändern oder es einfach aus zu lesen ohne kopieren zu müssen. so machts ja auch die funktion sprintf_s.
dabei solltest du aber beachten was dabei raus kommt:

Zitat

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int main()
{
  int  a[42];
  int* b = a;

  cout << sizeof(a) << endl;
  cout << sizeof(b) << endl;
}



Yep, hab ich schon. Vielen Dank nocheinmal an alle :)

Werbeanzeige