Krautkanal.com

Veröffentlicht am 2016-02-17 21:32:37 in /prog/

/prog/ 8436: Harro Bernd. Simple Frage an dich: Wenn ich in C+...

syntetyc Avatar
syntetyc:#8436

Harro Bernd.

Simple Frage an dich:

Wenn ich in C++ ein Array auf dem heap anlege:

int *P;
P = new int[20];

Wie greife ich dann auf die eizelnen Werte zu?

so:
*P[5] = 20;

oder so:
*(P+4)= 20;

oder etwa anders?

Danke im Voraus.

rawdiggie Avatar
rawdiggie:#8437

P[5] = 20;

emmakardaras Avatar
emmakardaras:#8438

>>8437
Danke!

Aber weshalb ohne Sternchen?

christianoliff Avatar
christianoliff:#8439

*(P+4)=20
und P[5] ist das Gleiche

Wenn du P ist vom Typ int*.
Dann ist P[5] vom Typ int.
Also würde *P[5] gar keinen Sinn ergeben.

davidcazalis Avatar
davidcazalis:#8440

>>8439
Ich hätte vermutet, dass mir
P[5]
die Adresse des fünften Integerwertes liefert und nicht den Wert.

ryandownie Avatar
ryandownie:#8441

>>8438
>Aber weshalb ohne Sternchen?

Was >>8439 sagt. Bruce Eckel nimmt in "Thinking in C++" das ganze noch tiefergehend auseinander.

syntetyc Avatar
syntetyc:#8444

>>8440
Für die Adressen von Variablen gibt es '&', wenn ich das richtig in Erinnerung habe.

joshjoshmatson Avatar
joshjoshmatson:#8445

>>8440

>>8437 noch mal hier, wollte eigentlich gestern noch genauer drauf eingehen, aber bin vorher eingeschlafen.

Ich glaube, dir geht es so ähnlich wie mir, als ich mit C/C++ anfing. Ich musste mich auch erst daran gewöhnen: Es gibt in C keine Arrays! Salopp ausgedrückt. Es gibt sie natürlich schon, aber es gibt keinen eigenen Typ dafür.

Nehmen wir zum Beispiel mal folgenden Code:

int p[100];
int q* = new int[100];


Wenn man von anderen Programmiersprachen kommt, könnte man meinen, dass diese Variablen irgendwie unterschiedliche Typen haben. Nach dem Motto:
>p ist ein Array, und q ist ein Pointer auf den ersten Eintrag eines Arrays.

Das ist aber nicht so. Es kann auch gar nicht so sein, denn ein Konzept wie "ist ein Array" gibt es in C gar nicht. Man kann in C nie "das Array" haben, sondern immer nur einen Pointer darauf.

Das heißt, auch wenn man schreibt:

int p[100];

Dann deklariert man in Wirklichkeit p als einen Pointer, obwohl in der Deklaration kein * auftaucht. Die Zeile ist eigentlich nur eine Anweisung an den Compiler "Bitte reserviere hier Platz für 100 Elemente und liefer mir den Pointer auf das erste Element".

Das heißt p und q haben den selben Typ, nämlich int* ("Pointer auf Int"). Deswegen geschieht auch der Zugriff mittels [] in beiden Fällen auf die gleiche Weise.

Hoffe, es ist einigermaßen verständlich.

zl;ng: Arrays sind in C nur syntaktischer Zucker für Pointer.

jpotts18 Avatar
jpotts18:#8450

>>8445
Ich denke ich habe verstanden.
Es ging mir ursprünglich darum, den Unterschied zwischen Stack und heap zu verstehen.

Wenn ich also ein 100er Array anlegen möchte, dann sähe das jewils so aus:

Stack
int a[100];

Heap
int a = new int[100];

Und der Zugriff erfolgt dann so:

Stack
a[15] = 9;

Heap
a[15] = 9;

Die Pointer (mit dem Sternchen) brauch ich demnach also nur bei einzelnen Variablen?
Oder auch da nicht?

Stack
int a[100];

Heap
int a = new int;

Und der Zugriff erfolgt dann so:

Stack
a = 9;

Heap
*a = 9;
Und in a stünde die Adresse auf dem Heap?

herrhaase Avatar
herrhaase:#8453

>>8450
Wenn du new verwendest, musst du die Variable als Pointer deklarieren.

int *a = new int[100];

int *a = new int;

Ansonsten stimmt es.

dwardt Avatar
dwardt:#8457

Bernd der ueberlegt, C++ zu lernen, las letztens, dass "new ..." jetzt mit den neuen Standards veraltet sei, ist da was dran?

dmackerman Avatar
dmackerman:#8458

>>8453
Ok, damit wären alle meine Fragen beantwortet.

Mulle zum Dank an Alle.

subburam Avatar
subburam:#8459

Das ist nicht ganz richtig. Arrays sind keine Pointer. Soweit Bernd erinnert (er hat aus offensichtlichen Gründen immer ***Sternchen gestapelt), ist int[5] auch etwas anderes als *int, technisch gesehen (benutzt ja eh kein Mensch)

Außerdem kannst du einen Pointer hoch und runterzählen. Ein Array, das zu einem Pointer zerfällt, ist zwar dasselbe in Grün, aber eine Konstante.

suprb Avatar
suprb:#8468

>>8459
Ob konstant oder nicht hat nichts damit zu tun, ob es ein Pointer ist oder nicht. Es gibt auch sonst konstante Pointer. Siehe http://www.thegeekstuff.com/2012/06/c-constant-pointers/

markolschesky Avatar
markolschesky:#8469

ja sicher datt, nur auf dem Niwo von OP ist die Frage ganz klar

foo *bar; gegen foo baz[20];

und da hängt dann auch noch so sachen dran wie daß man erstmal bar was vom malloc zuweisen muß und so.

abotap Avatar
abotap:#8470

Abgesehen von diesen Arraytypen die nur zur Schikane da sind haben sie irgendwann in C99 oder später Arrays mit Nutz eingebaut, man konnte irgendwie mehrdimensionale Arrays übergeben und da war es dann wichtig wieviel Elemente da drin hocken.

1markiz Avatar
1markiz:#8474

Komme erstmal im Jahr 2016 an und benutze raw pointer nur, wenn es wirklich notwendig ist.

carloscrvntsg Avatar
carloscrvntsg:#8484

>>8439
Wenn dann *(P+sizeof(P) * 4)=20

aadesh Avatar
aadesh:#8485

>>8484
Nein.

shadowfreakapps Avatar
shadowfreakapps:#8486

>>8458
>Ok, damit wären alle meine Fragen beantwortet.

betraydan Avatar
betraydan:#8507

Übrigens sollte man, wenn man schon in C++ ist, lieber Templates verwenden, also sowas wie
std::vector<int> P; In fast allen Fälen vorzuziehen weil Schlampereien nicht zu irrsinnigen Fehlern 50000 Zeilen weiter führen.

Neuste Fäden in diesem Brett: