2015-05-27 7 views
5

Ich lerne über dynamischen Speicher in C++. Was ich als Standardmethode gelernt & Aufheben der Zuordnung dynamisch für jeden Datentyp der Zuweisung ist zum BeispielWie reservieren Sie dynamisch Speicher für ein Char-Array in C++?

//For double, 
double* pvalue1 = nullptr; 
pvalue1 = new double; 
*pvalue1 = 17.3; 
delete pvalue1; //free up when I'm done 

ABER, für eine char Array, erfuhr ich, dass es anders gehandhabt hat:

char* pvalue2 = nullptr; 
pvalue2 = new char[6]; 
strncpy(pvalue2,"Hello",sizeof("Hello")); 

std::cout << "Pointed-to value of pvalue2 is " << *pvalue2 << std::endl; 
std::cout << "Value of pvalue2 is " << pvalue2 << std::endl; 

delete [] pvalue2; //free up when I'm done 

Dann , auf Eingabeaufforderung:

Pointed-to value of pvalue2 is H 
Value of pvalue2 is Hello 
  1. Warum den Zeiger pvalue2 geben Sie das "pointed" String-Literal anstelle der Speicheradresse? Ist ein "Zeigerwert" nicht immer die Speicheradresse, auf die er zeigt?
  2. Warum gibt Dereferenzierung nur das erste Zeichen im Array?
  3. Wie kann ich dann die Speicheradresse bekommen, in diesem Fall?
+0

Es ist besser, rohe Zeiger vollständig zu vermeiden und intelligente Zeiger oder Container zu verwenden. – o11c

Antwort

6

Warum gibt der Zeiger pvalue2 anstelle der Speicheradresse das String-Literal "pointed-to" an?

Da es eine besondere Überlastung von << ist so, dass char* Streaming geben die Zeichenfolge verweist er auf, nicht den Zeigerwert. Das ist normalerweise das, was du willst.

Ist ein "Zeigerwert" nicht immer die Speicheradresse, auf die er zeigt?

Ja.

Warum gibt Dereferenzierung nur das erste Zeichen im Array?

Da ein Zeiger die Adresse eines einzelnen Objekts enthält, das in diesem Fall das erste Element des Arrays ist. Auf andere Elemente kann unter Verwendung von Zeigerarithmetik zugegriffen werden, z. pvalue2[2] für das dritte Element.

Wie kann ich dann die Speicheradresse bekommen, in diesem Fall?

Um es mit << zu drucken, auf einen anderen Zeigertyp wandeln die char* Überlastung zu vermeiden:

std::cout << static_cast<void*>(pvalue2); 
9

Die operator<< von Ausgangsströme hat eine Überlastung zu char*, die das Zeichenfeld als eine Zeichenfolge anstelle eines generischen Zeigers interpretiert. Daher gibt es den Wert der Zeichenfolge aus. Verwenden Sie static_cast<void*>(pvalue2), um die Adresse zu drucken.

Die Dereferenzierung der Zeichenfolge gibt Ihnen eine char, die keine Zeichenfolge ist.

Wenn Sie C++ verwenden, verwenden Sie lieber std::string anstelle von Zeichenfeldern. Wenn Sie eine Zeichenfolge im C-Stil für etwas benötigen, können Sie eine Zeichenfelddarstellung der Zeichenfolge abrufen, indem Sie die Methode c_str() aufrufen.

0
  1. Ich zitierte in Frage „gibt“ lieber hätte als „pointed- zu "weil der erste in deinen Gedanken verschwommen ist. Was Sie mit Objekten tun, liegt an Ihnen. pvalue2ist nur eine Nummer.

  2. Gleiches "gibt". Nun deneferenziert einen Zeiger auf char gibt die char selbst zurück. Bei C-Strings wird das erste Zeichen zurückgegeben.

  3. Natürlich ist das vor allem was Zeiger sind. Der Rest ist die Artikelgröße, die dem Typ selbst innewohnt. (Das Inkrementieren von Zeigern wird um die Elementgröße erhöht, nicht um 1).

  4. In welchem ​​Fall? Wenn Sie einen Zeiger halten, haben Sie bereits die Speicheradresse. Wenn Sie den ersten Buchstaben halten (Fall 3, nehme ich an), nehmen Sie seine Adresse.