Transparentes Zeiger auf Zeichen-Arrays in C ++ Swapping
Frage
Ich habe ein 2D-Zeichenfeld:
char nm[MAX1][MAX2] = { "john", "bob", "david" };
Ich möchte zwei dieser Elemente tauschen (ohne std::swap
) durch einfaches Schreiben
swapPointers(nm[0], nm[1]);
wo swapPointers
wie folgt aussieht
void swapPointers(char *&a, char *&b)
{
char *temp = a;
a = b;
b = a;
}
Dies ist jedoch nicht kompiliert (und beim Hinzufügen von Abgüssen kompilieren macht, enden die Zeiger auf falsch / seltsame Stellen nach oben).
Kann jemand helfen?
Dank!
Lösung
Zan ist in der Nähe, aber sein Problem ist, dass sein ‚Swap‘ -Funktion alle Zeiger auf Zeichen nehmen. Dies kann zu Problemen führen, wenn missbraucht. Hier ist eine sicherere Version:
void swap(char (&x)[MAX2], char (&y)[MAX2])
{
char temp[MAX2];
memcpy(temp, x, MAX2);
memcpy(x, y, MAX2);
memcpy(y, temp, MAX2);
}
Es gibt auch ein Missverständnis seitens des Plakats: ‚nm‘ ist ein 2-dimensionales Array von Zeichen. Es gibt keine Zeiger. nm [0], nm [2], etc ... sind auch keine Zeiger entweder - sie sind noch (1-dimensional) Arrays. Die Tatsache, dass 1-dimensionalen Arrays Zeiger implizit konvertierbar sind die Ursachen dieser Art von Verwirrung bei vielen C und C ++ Programmierer.
Um die Daten in dem 2-dimensionalen Array zu tauschen, müssen Sie Speicherblocks der Größe MAX2 tauschen - wie Zan von beiden ‚Swap‘ Funktionen angezeigt und ich schrieb
.Andere Tipps
Sie können nicht diese Zeiger tauschen durch den Zeiger Zu, weil diese Zeiger in einen 2-D-Zeichen-Array zeigen.
nm [a] und nm [b] sind sehr stark const
weil nm ein wirklich const
Objekt ist. Wenn es nicht ist, konnte man C-Variablen um in RAM verschieben, indem ihre Namen Zu.
Man denke nur an das Chaos! So kann man das nicht. : -)
So tauschen, was die Zeiger zeigen auf, müssen Sie die Werte in diesen Feldpositionen tauschen.
swap(char *a, char *b)
{
char temp[MAX1];
memcpy(temp, a, MAX1);
memcpy(b, a, MAX1);
memcpy(a, temp, MAX1);
}
Ihre swapPointers()
Swaps Zeiger, während Sie versuchen, es Arrays zu übergeben.
Wenn Sie ändern
char nm[MAX1][MAX2]
char *nm[MAX1]
und fixieren Sie die kleinen Fehler in swapPointers()
(letzte Zeile sollte b = temp;
sein), es funktioniert.
Der eigentliche Punkt ist, wenn Sie c ++ verwenden, dann sollten Sie eine std :: vector von std verwenden :: string statt:
std::vector<std::string> nm;
nm.push_back( "john" );
nm.push_back( "bob" );
nm.push_back( "david" );
std::swap( nm[0], nm[1] );
. Hinweis: nicht getestet
void swapPointers(char** ppa, char** ppb)
{
char* ptemp = *ppa;
*ppb = *ppa;
*ppa = ptemp;
}
swapPointers(&nm[0], &nm[1]);