Unterschied char[] und char*
-
JnZn558 schrieb:
2. Wie mache ich folgende richtig?
In dem du ohne char*/char[] arbeitest und std::string verwendest. Letzteres sollte man immer vorher lernen, da das arbeiten mit den C-Arrays unter C++ in der Regel untypisch und zudem komplizierter ist (Zumal std::string auch unproblematisch kopiert und zugewiesen werden kann, und sich selbst um das Speichermanagement kümmert).
#include <iostream> #include <string> int main() { std::string input; std::cout << "Text eingeben: "; std::cin >> input; std::cout << "Textausgabe: " << input << std::endl; system("pause"); // Siehe FAQ (DOS/Konsole) für bessere Alternative return 0; }
Adressen eingeben ist niemals sinnvoll, gerade nicht auf Betriebssystemen bei denen jede Anwendung einen eigenen Adressraum bekommt.
Grundsätzlich müssen Zeiger immer auf einen allozierten Speicherbereich verweisen (new/delete). Beispiel:
int main() { char* text = new char[20]; // Etwas mit text anstellen delete[] text; }
-
JnZn558 schrieb:
// ich weiss wie das mit char array, nur ich wollte wissen wie das mit char Zeiger geht char* sztext = "Textversuch"; char* szinput; char* szadress;
der erste pointer (sztext) wird mit der adresse einer zeichenkette ("Textversuch") initialisiert. diese zeichenkette liegt oft in einem schreibgeschützten bereich, so dass du über den pointer nur lesend drauf zugreifen solltest. die anderen beiden pointer sind unitialisiert, zeigen also auf nichts sinnvolles und jedes dereferenzieren solltest du lassen, bevor du ihnen etwas zugewiesen hast. übrigens, wenn du über pointer auch daten verändern willst, dann könntest du sowas machen:
char array[] = "Textversuch"; // array ist 'read/write' char *sztext = array; // pointer zeigt auf array
^^in dem beispiel wird der string "Textversuch" bei der initialierung nach 'array' kopiert (dadurch wird auch die grösse von 'array' festgelegt). array wird damit eine beschreibbare kopie der stringkonstanten "Textversuch" und ein pointer, der darauf zeigt, darf array auch verändern.
-
nt main()
{
char* text = new char[20];
// Etwas mit text anstellen
delete[] text;
}das sehe ich aber oft genug ohne new
hat einfach char* text = "LOL";
-
Ich denke das mit new wird hier auf Input bezogen, nicht wenn man direkt einen String zuweist
-
Wenn dein Compiler gut ist, wird er bei
char* mystring = "hello, world";
meckern (respektive eine Warning ausgeben), weils es kein Zeiger auf einen konstantes char ist.
char const* mystring = "hello, world"; // oder das äquivalent const char* mystring = "hello, world";
drücken gleich aus was der string ist: unveränderlich.
aber char* und char[] stinken sowieso, nimm std::string.
-
char *my_stupid_string = "stupid string"; ist legales C und C++, da gibts maximal ne Warnung.
-
danke erstmal für alle Antworten.
ich wollte nur wissen, ob es möglich ist, Adresse von sztext, die ich ausgegeben habe, wieder durch eingabe an szinput zuweisen kann?#include <iostream>
using namespace std;
int main() {
// ich weiss wie das mit char array, nur ich wollte wissen wie das mit char Zeiger geht
char* sztext = "Textversuch";
char* szinput = 0;
cout << "Adresse von sztext: " << &sztext << endl;
cout << "Adresse von sztext eingeben: ";
cin >> szinput;
return 0;
}
-
Kleiner Einschub:
system("pause"); // Siehe FAQ (DOS/Konsole) für bessere Alternative
std::cin.get();
lg Max
-
JnZn558 schrieb:
danke erstmal für alle Antworten.
ich wollte nur wissen, ob es möglich ist, Adresse von sztext, die ich ausgegeben habe, wieder durch eingabe an szinput zuweisen kann?#include <iostream>
using namespace std;
int main() {
// ich weiss wie das mit char array, nur ich wollte wissen wie das mit char Zeiger geht
char* sztext = "Textversuch";
char* szinput = 0;
cout << "Adresse von sztext: " << &sztext << endl;
cout << "Adresse von sztext eingeben: ";
cin >> szinput;
return 0;
}Es ist möglich die Adresse szinput zuzuweisen, wie bereits geschrieben wird das dann auch ein Zeiger auf const char!
Du musst genau wissen was du machst.... cout << "Adresse von sztext: " << &sztext << endl;
Diese Zeile liefert Dir die Adresse der Stackvariablen char* sztext und nicht die Adresse von "Textversuch"!.
Die Adresse von "Textversuch" erhältst Du so:
#include <iostream> using namespace std; int main() { char* sztext = "Textversuch"; char* szinput = 0; int tmp; cout << "Adresse von sztext: " << hex << reinterpret_cast<int>(*&sztext) << endl; cout << "Adresse von sztext eingeben: " << endl; cin >> hex >> tmp; szinput = reinterpret_cast<char*>(tmp); cout << hex << szinput << endl; return 0; }
mfg
-
egon2 schrieb:
Es ist möglich die Adresse szinput zuzuweisen, wie bereits geschrieben wird das dann auch ein Zeiger auf const char!
Du musst genau wissen was du machst.... cout << "Adresse von sztext: " << &sztext << endl;
Diese Zeile liefert Dir die Adresse der Stackvariablen char* sztext und nicht die Adresse von "Textversuch"!.
Die Adresse von "Textversuch" erhältst Du so:
#include <iostream> using namespace std; int main() { char* sztext = "Textversuch"; char* szinput = 0; int tmp; cout << "Adresse von sztext: " << hex << reinterpret_cast<int>(*&sztext) << endl; cout << "Adresse von sztext eingeben: " << endl; cin >> hex >> tmp; szinput = reinterpret_cast<char*>(tmp); cout << hex << szinput << endl; return 0; }
mfg
Danke egon2, ist genau das was ich auch wissen wollte!