Zeiger auf Array
-
arr = {1, 2, 3, ....., n}; int (*p1)[5] = &arr; // Pointer auf Array int* p2 = &arr[0]; // Pointer auf das erste Element des Arrays int* p3 = arr; // Pointer auf das erste Element des ArraysKann es sein, dass bei den beiden letzteren Zeigern die Information verloren geht, wieviele Elemente das ursprüngliche Array hatte und womit somit der
sizeof Operator zur Ermittlung der Elementanzahl nicht mehr funktioniert?anzahl = sizeof(p1)/sizeof(int);
-
ja.
-
Ja. sizeof funktioniert so, wie du es willst, nur mit Arrays, nicht mit Zeigern auf Arrays. Da liefert sizeof die Größe des Zeigers.
-
Danke und wie kriege ich das hin, dass es auch mit Zeigern funktioniert?
Im Prinzip genügt es mir, wenn ich die Anzahl der Elemente herausfinde.
Wenn das auch ohne sizeof geht (auch in c?), dann würde ich das gerne wissen.
-
...
-
das geht sogar ganz einfach und das auf 2 Arten, die eine klappt auch in C.
std::vector<int> arr; arr.size(); //hier haste die Größeint arr[5]; unsigned int groesse = 5; // heir ahste die Größe, die Variable nimmste dir halt immer mit und überall hin
-
Skym0sh0 schrieb:
das geht sogar ganz einfach und das auf 2 Arten, die eine klappt auch in C.
std::vector<int> arr; arr.size(); //hier haste die GrößeDanke, das könnte beim nächsten C++ Projekt funktionieren.
Momentan sitze ich aber an c Code.int arr[5]; unsigned int groesse = 5; // heir ahste die Größe, die Variable nimmste dir halt immer mit und überall hinDas habe ich befürchtet.
Ich will halt nicht extra Variablen mitrumschleppen, aber wenn es nicht anders geht, werde ich es wohl doch so machen müssen.
Es wäre schöner gewesen, wenn man das irgendwie dynamisch aus dem Zeiger gewinnen könnte.Mit nem Struct dürfte es wohl auch gehen, oder?
-
...
-
sizeof schrieb:
Momentan sitze ich aber an c Code.
Und warum postest du dann im C++-Forum?

-
sizeof schrieb:
Mit nem Struct dürfte es wohl auch gehen, oder?
Also in C würde ich mir wirklich ein struct basteln, was mir die Größe nachhält:
typedef struct { int * ptr; unsigned int size; }Array;Aber als C++'ler findet man sowas ungefähr so schön wie normale Menschen einen HipHopper ohen Swag und ohne Yolo-Motto...
-
Swordfish schrieb:
sizeof schrieb:
Mit nem Struct dürfte es wohl auch gehen, oder?
Zeig mal?Skym0sh0 war schneller.
_matze schrieb:
sizeof schrieb:
Momentan sitze ich aber an c Code.
Und warum postest du dann im C++-Forum?

Weil ich's auch für C++ wissen will, brauche ja beides, wenn auch nicht sofort.
-
sizeof schrieb:
anzahl = sizeof(p1)/sizeof(int);
sizeof(p1) ist nicht das, was du willst. Im ersten Fall müsstest du
sizeof(*p1) schreiben; denn sizeof(p1) wird immer gleich sizeof(void*) und damit unabhängig von der Größe des referenzierten Arrays sein. sizeof(void*) ist groß genug, dass man sich darin eine Adresse merken kann.Für ein Array kannst du dir aber auch ähnlich wie hier einen eigenen Typen für Array-Referenzen bauen. Zu benutzen wär das dann so:
void show(array_ref<const int> ar) { cout << "["; for (int i=0; i<ar.size(); ++i) { if (i>0) cout << ", "; cout << ar[i]; } cout << "]\n"; } int main() { vector<int> foo = {1,2,3,5,8}; show(foo); }Im Wesentlichen funktioniert array_ref wie eine normale Lvalue-Referenz wobei allerdings die Länge des Arrays eine Laufzeiteigentschaft ist und ein array_ref von rohen Arrays, std::array und std::vector erzeugt werden könnte. Eine Konvertierung von array_ref<U> nach array_ref<T> sollte auch erlaubt werden, wenn U* nach T* konvertierbar ist und sizeof(U)==sizeof(T) gilt.
Ich habe so etwas mal vor nicht allzu langer Zeit mit C++11 Mitteln zu Hause gebastelt und könnte die Implementierung bei Interesse demnächst mal online stellen. Im Moment sitz ich allerdings im Büro.
-
sizeof schrieb:
Weil ich's auch für C++ wissen will, brauche ja beides, wenn auch nicht sofort.
Ja, aber wie du merkst, wird dir hier ständig die std::vector-Variante empfohlen, mit der du in C wenig anfangen kannst.
