2 Stimmen

Array von Ganzzahlen vs. Zeiger auf Ganzzahl in c++

Wenn ich int x[10] und int *y habe, wie kann ich den Unterschied zwischen den beiden erkennen?

Ich habe zwei Ideen:

  1. sizeof() ist anders.

  2. &x hat einen anderen Typ --- int (*p)[10] = &x funktioniert, aber nicht int **q = &x.

Noch andere Ideen?

In einigen Vorlagenbibliothekscode muss ich bestimmen, ob ein Zeiger ein "echter" Zeiger ist oder von einem Array abgeleitet wurde. Ich kann keinen Quellcode ansehen, da der Bibliotheksnutzer erst existiert, wenn ich die Bibliothek schreibe. ... Ich kann dies umgehen, indem ich den Code neu schreibe, also ist dies jetzt nur eine theoretische Übung.

0voto

Josh S Punkte 127

Ich habe gerade das Äquivalent im g++ 4.5 C++0x-Modus für char-Arrays ausprobiert und es erlaubt mir nicht, sowohl zu definieren

template void moresilly(const T v[],const char *description)

ALS AUCH

template void moresilly(const T *v,const char *description)

es behauptet, dass beide der gleiche Typ sind.

Ich hatte eine Funktion:

template void silly(const T & v,const char *description)
{
    cout<<"Größe von "<

``

Es gibt die Größe eines Arrays richtig an, wenn es übergeben wird, und die eines Zeigers, wenn es übergeben wird, aber ich kann moresilly nicht verwenden, um zwischen Zeiger und Array zu unterscheiden, sodass ich ein 4-zeichiges Array nicht von einem Zeiger auf n-Zeichen unterscheiden kann.

Es könnte funktionieren, sozusagen, Vorlagen für T[1], T[2], T[3] usw. zu haben, aber es gibt bereits einen Beitrag, der besagt, dass verschiedene Compiler das (oder einen ähnlichen Fall) unterschiedlich behandeln und dass GNU eine Übereinstimmung mit einem Zeiger in C++11 bevorzugt.

... später hinzugefügt: Nach einigen Experimenten habe ich etwas gefunden, das in g++ 4.5 funktioniert

template void moresilly(const T (&v)[L],const char *description)
{
    cout<void moresilly(const T *v,const char *description)
{
    cout<void moresilly(const T v,const char *description)
{
    cout<void silly(const T & v,const char *description)
{
    cout<<"Größe von "<

`

mit dem folgendes ordnungsgemäß funktioniert

    silly("12345","sofortiger String aus 5 Zeichen plus Null");
    silly((const char *)"12345","sofortiger konstanter Zeiger auf char von 5 Zeichen plus Null");
    char testarray[]="abcdef";
    silly(testarray,"Char-Array aus 6 Zeichen plus Null");
const char testarray2[]="abcdefg";
silly(testarray2,"const char-Array aus 7 Zeichen plus Null");

Beachten Sie, dass wenn die erste Funktion mit "const T v[L]" anstelle von "const T (&v)[L]" definiert wird, funktioniert es nicht, es passt nie zu etwas.

Also habe ich dein Problem gelöst, aber erwarte nicht, dass dies in anderen Versionen des Compilers einschließlich zukünftiger funktioniert. Deshalb hasse ich c++. Irgendwie ist die Definition der Sprache so unklar, dass Compiler voller instabiler Grenzfälle sind.

Dies ist jedoch ein nützlicher Trick, den ich vielleicht verwenden werde.

` ``

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X