[C++]Frage zu Pointern

01/02/2012 17:37 Terreox#1
Hi zusammen,
ich arbeite mich momentan durch die XoaX.net C++ Reihe und ergänze nebenbei durch andere Videos von Youtube.
Bin zwar schon an Pointern vorbei, aber hab glaub ich mittlerweile den Sinn verstanden. Trotzdem möchte ich meine Vermutung "absichern".

Ich dachte immer, wofür Pointer?

Ich habe jetzt mal folgendes Beispiel geschrieben:
Code:
#include <iostream>

void changeName(char* newname);

char caString[12] = "ElitePvPers";

int main(){
	using namespace std;

	cout << caString << endl;

	char caOldString[10] = "HalloWelt";
	changeName(caOldString);

	cout << caString << endl;

	return 0;

}

void changeName(char* newname){
	strcpy(caString, newname);
}
Jetzt dazu ein Beispiel ohne Pointer:
Code:
#include <iostream>

void changeName(char newname[10]);

char caString[12] = "ElitePvPers";

int main(){
	using namespace std;

	cout << caString << endl;

	char caOldString[10] = "HalloWelt";
	changeName(caOldString);

	cout << caString << endl;

	return 0;

}

void changeName(char newname[10]){
	strcpy(caString, newname);
}
Hier übergebe ich ja das ganze char-Array an die Funktion changeName.

Jetzt zu meiner Frage:

1) Ist es richtig, dass der Vorteil des Beispiels mit Pointern darin liegt, dass weniger Speicher verbraucht wird, weil nur die Adresse des caOldString übergeben wird anstatt die ganze Variable nochmal?

2) Kann man den Speicherverbrauch der beiden Programme irgendwie sichtbar machen? Bei so kleinen Programmen ist das ja ein kleiner Unterschied, aber gibt es Programme (vielleicht auch Tools in VisualStudio), mit denen ich den exakten Speicherverbrauch sehen kann? Würde das mal gerne auch später bei größeren Programmen beobachten, inwiefern sich Optimierungen auswirken. Finde das sehr interessant^^


Würde mich über Antworten freuen :)
Greetz
01/02/2012 17:46 Dr. Coxxy#2
im grunde hast du recht,
dein beispiel ist aber schlecht, weil du ein array genommen hast, was auch ein pointer ist - es wird ein ptr auf das erste arrayelement übergeben.
ein pointer ist IMMER 4 byte groß (32-bit), während strukturen und klassen idr. größer sind und es damit besser ist einen pointer zu übergeben, als eine komplette kopie der struktur/klasse.

mit pointern ergeben sich aber noch andere möglichkeiten, als "nur" speicher zu sparen, z.b. variable datentypen (ein void pointer kann auf beliebige datentypen zeigen) etc.
01/02/2012 18:23 Terreox#3
ah ok vielen dank für deine Antwort :) Dann hab ich es ja wirklich verstanden^^
gut das mit array wusste ich, hab ich nur nicht dran gedacht^^
01/02/2012 19:55 MrSm!th#4
Der Unterschied zwischen Array und Pointer ist aber, dass das Array fest in der Datei gespeichert und auf dem Stack abgelegt wird.
Ein Pointer verweist normalerweise auf einen dynamisch allozierten Speicherblock, der im Freispeicher ist.

Btw. spart die Übergabe eines Pointers eigentlich weniger Speicher als Laufzeit (da nicht alles kopiert werden muss).
01/03/2012 10:13 jacky919#5
Außerdem ermöglichen Pointer auch das verändern von lokalen Variablen und nicht nur von globalen, d.h. hättest du den Namen in der main()-Funktion deklariert wäre es deiner Funktion nicht möglich gewesen den Namen zuverändert, denn die Funktion würde nur eine Kopie der Variable bekommen. Erst durch den Einsatz von Pointern könntest du den Namen durch die FUnktion ändern.
01/03/2012 13:00 MrSm!th#6
Du meinst die changeName erhält nur eine Kopie des Arrays?

Das ist nicht richtig, er hätte den String auch lokal deklarieren können und die Funktion würde trotzdem das Original modifizieren.
01/03/2012 15:15 Dr. Coxxy#7
ich glaub er meinte dass eher generell und jetzt nicht bei dem konkreten string beispiel^^
01/03/2012 15:20 jacky919#8
Ja bei einem Array funktioniert das natürlich, wollte das nur sagen weil der TE das vielleicht nicht wusste.