Tom: C/C++; Zeigt Zeiger auf ein Array?

Beitrag lesen

Hello,

Was sollte denn eigentlich passieren? Vielleicht beschreibst Du mal, was Du vor hattest.

Das habe ich doch schon bereits 2 mal getan. War das nicht deutlich oder deutsch genug?

if(p == ARRAY) {

Wird das Problem somit deutlicher?
Es geht mir nur darum, von einem beliebigen Zeiger mit beliebgen Typ in Erfahrung zu bringen ob es sich dabei um ein Array handelt. Das Programm darf aber nicht abstürzen.

Bist Du sicher, dass Du in C++ programmieren willst und nicht vielleicht in PHP?

Zeiger tragen keine Information darüber, ob sie auf ein Array eines Typs zeigen, oder nur auf ein Element des Typs. Genaugenommen zeigen sie immer nur auf ein Element, bei einem Array eben auf das erste.

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    int* a;
    char* z = {"hallo Grossmutter"};
    char* y;

y = z;

char* p1 = (char*)NULL;   // hier wird ein Zeiger auf eine Char-Array erzeugt,
                              // dessen erste vier Bytes dann mit dem Wert von NULL
                              // überschrieben werden. Es wird also NICHT der Zeiger
                              // überschrieben!
                              // Intel-32-Plattform vorausgesetzt!
    char* p2 = (char*)NULL;   // hier das Gleiche

char* p3 = "Hallo neue Welt";  // hier wird ein Array mit dem Inhalt "Hallo ..."
                                   // angelegt und ein Zeiger darauf erzeugt

char* _p1 = new char;     // hier wird ein Zeiger auf einen Char im Heap erzeugt
                              // was im Char drinsteht ist ungewiss.
    char* _p2 = new char[1024]; // hier wird ein Zeiger auf ein Char-Array auf dem Heap
    char* _p4 = new char[1024]; // erzeugt

*_p2 = 'H';
 *(_p2+1) = 'a';       // Hier werden einzelne Elemente des Arrays auf dem Heap
 *(_p2+2) = 'l';       // verändert
 *(_p2+3) = 'l';
 *(_p2+4) = 'o';
 *(_p2+1000) = '\0';

short c = 0;

cout << "p3: " << p3 << endl;
    cout << "p3[11]: " << p3[11] << endl;
    cout << "p3+1: " << p3+1 << endl;

cout << "c: " << c << endl;

//    cout << *p1 << endl;      // das ist verboten, weil p1 ein Zeiger auf ein Char-Array
                                // ist und du die ersten vier Bytes davon mit NULL überschrieben
                                // hast. Wenn Du p1 mit cout ausgeben würdest, würde nichts aus-
                                // gegeben werden, weil NULL hier vermutlich 0000 ist, worauf man
                                // sich aber nicht bei jeder Plattform verlassen kann.
                                // NULL kann auch eine fiktive Adresse enthalten!
                                // wenn Du nun *p1 ausgeben lässt, dann wird (fälschlicherweise)
                                // versucht, auszugeben, worauf das zeigt, was dort steht,
                                // worauf p1 zeigt, also hier, worauf 0000 zeigt.
                                // das ist aber verboten, weil es nicht zu Deinem Speicherbereich
                                // gehört.

// cout << p2 << endl;     // warum hier "Ende" ist, habe ich nch nicht ergründet.

cout << "_p2: " << _p2 << endl;
    cout << "*_p2: " << *_p2 << endl;
    cout << "*p2[1]: " << _p2[1] << endl;

cout << "_p4: " << _p4 << endl;
    cout << "_p4: " << *_p4 << endl;

cout << "a*: " << a << endl;
    cout << "z*: " << z << endl;
    cout << "y*: " << y << endl;

return EXIT_SUCCESS;
}

Probier es nochmal aus.
Und denke auch daran, dass in cout die Operatoren überladen sind und sich der Stream deshalb bei jedem übergebenen Datentyp anders verhalten kann.

Liebe Grüße aus Syburg bei Dortmund

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de