it-swarm.com.de

Umwandlungszeiger auf Array (int * bis int [2])

Wie kann ich ein int * in ein int [x] umwandeln oder konvertieren?

Als Beispiel habe ich versucht, den Zeiger int* c = new int[x] in ein Array int b[2] umzuwandeln.

int b[2] = { 2, 3 };
int* c = new int[b[1]];

c[0] = b[0];
c[1] = b[1];
c[2] = a;

Zunächst einmal weiß ich, dass ich kann den Zeiger durchlaufen und Array. Konvertieren Sie daher den Zeiger mit []-Operatoren in ein Array, um den Zeiger und das Array zu indizieren, und weisen Sie den Array-Elementen Zeigerelemente zu, wenn Sie iterieren (zB arr[i] = p[i]). Ich möchte wissen, ob das gleiche Ergebnis in weniger Codezeilen erzielt werden kann.

Ich versuchte es selbst herauszufinden, also machte ich ein schnelles Programm, um sicherzugehen, dass ich genau wusste, was ich wo platzieren möchte. Die Ausgabe ist knapp darunter:

Address of {type: int} &a =             0031FEF4; a = 1
Address of {type: int[2]} &b =          0031FEE4; b = 0031FEE4
Address of {type: int[2]} &b[0] =       0031FEE4; b[0] = 2
Address of {type: int[2]} &b[1] =       0031FEE8; b[1] = 3
Address of {type: int*} &c =            0031FED8; c = 008428C8
Address of {type: int*} &c[0] =         008428C8; c[0] = 2
Address of {type: int*} &c[2] =         008428D0; c[2] = 1

Einmal stellte ich sicher, dass ich wusste, wo ich ein paar Dinge ausprobierte. Die erste Idee, die mir in den Sinn kam, war, die Adresse des zweiten Elements in die Zuordnung des Zeigers zu übernehmen und dann die Speicheradresse des Arrays durch diese zu ersetzen (siehe den Code unten). Alles, was ich ausprobierte, schlug letztendlich fehl, meistens mit Syntaxfehlern.

Dies habe ich versucht. Ich möchte, dass dies funktioniert, da dies die einfachste Lösung wäre.

b = &c[1];

Das hat offensichtlich nicht funktioniert.

Edit: Solution:Tu es nicht! Wenn es notwendigist, _ _ einen Zeiger auf ein Array erstellen und dann auf das Array zeigen; dies ist für jeden Zweck, den ich ergründen kann, sinnlos .. Für ausführlichere Informationen siehe die Antwort von rodrigo unten.

17
Josh C

Zuallererst ist b ein Array, kein Zeiger, also nicht zuweisbar.

Sie können auch nichts in einen Array-Typ umwandeln. Sie können jedoch in Zeiger-zu-Array umwandeln . Beachten Sie, dass Zeiger-zu-Arrays in C und C++ eher ungewöhnlich sind. Es ist fast immer besser, einfache Zeiger oder Zeiger-zu-Zeiger zu verwenden und Zeiger-zu-Arrays zu vermeiden.

Was auch immer Sie fragen, kann mehr oder weniger gemacht werden:

int (*c)[2] = (int(*)[2])new int[2];

Ein typedef macht es jedoch einfacher:

typedef int ai[2];
ai *c = (ai*)new int[2];

Und um sicherzugehen, sollte das Löschen mit dem Originaltyp erfolgen:

delete [](int*)c;

Was schön ist, wenn man es nur zum Spaß macht. Im wirklichen Leben ist es normalerweise besser, std::vector zu verwenden.

22
rodrigo

Zunächst ist das Übertragen eines Zeigers auf ein Array im C-Stil im Allgemeinen eine sehr schlecht -Praxis.

Sie können jedoch ein temporäres Array ("rvalue array") in address/pointer zerlegen. Schreiben Sie einfach so etwas

#include <stdio.h>

int main()
{
    int *array  = (int[2]){1, 2};
    printf("%d", array[0]); /* array[0] contains 1 now */

    return 0;
} 

Ich möchte noch einmal betonen: Wenn Sie dies tun, sollten Sie gute Gründe für solche Tricks haben. 

P.S. Der oben aufgeführte Code gilt nur für C99/C11, nicht für moderne C++ - Compiler. 

0
Twissell