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

1

09.01.2010, 01:41

Zuweisung durch Zeiger mit New an Array

Hallo liebe Mitglieder,

habe eine Frage wg. der Syntax von Zeigern, wenn wir diesem Werte für einen Array zuweisen.

z. Bsp.

C-/C++-Quelltext

1
2
3
4
5
6
7
int *pArray = new int[30];

pArray[0]=22;
pArray[1]=60;

....
pArray[29] = 1000;


Ich dachte eigentlich immer, dass man Werte nur an einen Pointer zuweisen kann,wenn man den Dereferenzierungsoperator benutzt. Wieso aber kann man im obigen Beispiele, die Werte direkt zuweisen ohne das Sternchen?

Für eine leicht verständliche Antwort, vielen Dank vorab!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

09.01.2010, 01:49

Der []-Operator wirkt bei Arrays als Dereferenzierungsoperator.

Du hast ja (fast) das gleiche, wie wenn du das hier machst:

C-/C++-Quelltext

1
int array[30];


Da brauchst du auch keinen * mehr, um auf die Elemente zuzugreifen.
[] macht nix anderes, als:

C-/C++-Quelltext

1
2
array[29] = 2; //ist gleich

*(array+29) = 2;

3

09.01.2010, 01:52

Vielleicht habe ich es selber raus bekommen. Kann es sein, dass ich bei pointern das Sternchen (bei Arrays) nicht mit angeben brauch, weil ein Array selber wie ein Pointer ist und die eckigen Klammern als Dereferenzierungsersatz dienen?

Das würde auch erklären, warum man mit pointer auf Array auch "normal" rechnen kann (z. Bsp. Ergebnis += pArray)

Stimmt das? Wenn nicht, dann korrigiert mich bitte unbedingt :oops:

Edit:
Drakon war wieder mal schneller. Deine Antwort bestätigt das,was ich mir schon gedacht habe. Vielen,vielen Dank zum x-ten mal hast du mir bereits geholfen. Ganz großes Lob (vor allen Dinge habe ich zu so einer unchristlichen Zeit gar keine Antwort erwartet). Wirklich Top

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

09.01.2010, 02:01

es gibt durchaus einen unterschied. drakons version ist statisch, die größe muss zur kompilerzeit feststehen. bei deiner variante kannst du eine nicht statische variable als arraygröße nutzen, vergess aber nicht den speicher mit "delete [] " wieder frei zu geben.
"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?

5

09.01.2010, 02:09

Danke schön für den Hinweis NachoMan. Mir ging es aber nur um das Prinzip der Arrays und da hat mir Drakon mit seinem Listing eine wunderbare Steilvorlage fürs Verständnis geliefert, auch wenn mir der Gedanke dann später selber in den Sinn gekommen ist.

Nochmals Danke und Kompliment an euch Nachteulen :praise

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

09.01.2010, 02:21

Zitat von »"NachoMan"«

es gibt durchaus einen unterschied. drakons version ist statisch, die größe muss zur kompilerzeit feststehen. bei deiner variante kannst du eine nicht statische variable als arraygröße nutzen, vergess aber nicht den speicher mit "delete [] " wieder frei zu geben.


Klar ist das anderst, aber auf den Unterschied von dynamischen und automatischen Speicher wollte er, denke ich nicht hinaus. ;)
Was ich mit "fast" gemeint habe, war, dass der Unterschied ist, dass bei seiner Version im Gegensatz zu meiner er pArray wirklich ein Zeiger ist und nicht, wie bei mir ein Array. (kleiner, aber feiner Unterschied, den man meist gar nicht zu beachten braucht, aber es gibt Ausnahmefälle).

btw:
:shock: Schon so spät. Ich sollte auch mal ins Bett.. :?

/EDIT
Dachte doch, dass ich irgendwo mal eine genaue Betrachtung gesehen habe:
https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=9564&postdays=0&postorder=asc&highlight=array&start=15

Man kann das spielchen mit aufdrösseln noch ein wenig weitertreiben. ;)

7

09.01.2010, 11:34

C-/C++-Quelltext

1
2
3
4
array[29] = 2; //ist gleich

*(array+29) = 2; // <=>

*(29+array) = 2; // <=>

29[array] = 2;


Nicht zu vergessen :D

/edit: Ach, steht ja schon im Link :(

8

09.01.2010, 17:17

Kann ich mir das dann vorstellen, dass int einen []-operator auf einen pointer besitzt, der dann entsprechend Zugriff erlaubt?

Und wo ist da der Sinn? Also warum wurde dieses "Feature" in c++ eingeführt?

So Far...

Laguna

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

09.01.2010, 17:31

dieses "feature" gibt es doch auch in c.

wenn du eine eigene klasse/struktur erstellst und ein array davon benutzt kannst du auf die elemente des array genau so zugreifen.

der sinn der dahinter steckt ist doch offensichtlich oder?
die schriftweise ist einfacher und übersichtlicher.
ein beispielfür ein 3dimensionales array:

Quellcode

1
2
3
4
int blaha[SizeOfX][SizeOfY][SizeOfZ];

blaha[14][45][74]
(*blaha+14*SizeOfX+45*SizeOfX*SizeOfY+74) // oder so ähnlich^^

ergibt beides das gleiche. was ist übersichtlicher?
"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?

10

09.01.2010, 18:12

Ne ich mein ja grade die letzte Codezeile

C-/C++-Quelltext

1
29[array] = 2;


Laguna

Werbeanzeige