C++ Pointer Frage...

elektro2

Cadet 4th Year
Registriert
Feb. 2014
Beiträge
67
Hallo liebes Forum..

Ich habe in der letzten Zeit viel mit Swift programmiert und wollte meine C++ Kenntnisse wieder auffrischen. Beim rummprobieren habe ich eine ungelöste Frage.

Eigentlich dachte ich, dass ich mit Pointern noch vertraut bin.

In diesem Fall gibt mit das Programm für *e 20 aus.
Ich dachte eigentlich, weil ich durch die Funktion "changePointer " den Pointer von array[0] auf die Adresse von p , in diesem Fall 100 lege , sollte auch e den wert von 100 enthalten.

Kann mir jemand weiterhelfen? Danke !

Code:
#include <iostream>

using namespace std;

void changePointer(int* f)
{
	int p = 100;
	f = &p;

	cout << "test" << endl;

}


int main()
{
	int a = 20;
	int b = 40;

	int* c = &a;
	int* d = &b;


	int* array[] = { c, d };

	changePointer(array[0]);

	int *e = array[0];

	

	cout << *e << endl;

	cin.get();



	return 0;
}
 
Das funktioniert nicht, weil du den Zeiger "by value" an deine Funktion changePointer() übergibst. Wenn du also nicht nur den Speicher, auf den f zeigt, modifizieren willst, sondern den Zeiger auf eine andere Stelle zeigen lassen möchtest, musst du z.B. einen Zeiger auf einen Zeiger übergeben (int** f).

Beachte aber, dass die Variable p lokal zur Funktion ist und nach dem Verlassen selbiger nicht mehr existiert.
 
Ah ok Danke... ich habe mir sowas mit Doppel Pointer schon gedacht. Stimmt. Wie ich es gemacht habe ist es ja call by value... Denkfehler :)
Ergänzung ()

Modifiziert geht es. Ich musste die Adresse übergeben, an der sich der Pointer befindet!

Code:
#include <iostream>

using namespace std;

void changePointer(int** f)
{
	int p = 100;
	*f = &p;

	cout << "test" << endl;

}


int main()
{
	int a = 20;
	int b = 40;

	int* c = &a;
	int* d = &b;


	int* array[] = { c, d };

	changePointer(&array[0]);

	int *e = array[0];

	

	cout << *e << endl;

	cin.get();



	return 0;
}
 
Du kannst übrigens auch eine Referenz auf einen Pointer übergeben. Das hat den gleichen Effekt, sieht von der Syntax her aber wenig "albern" aus. ;)

Code:
#include <iostream>

int after = 100;

void changePointer(int*& f)
{
	f = &after; 
}

int main()
{
    int before = 600;
   

    int* ptr = &before;

    std::cout << "Before: " << std::hex << ptr << std::dec << "\n";

    changePointer( ptr );

    std::cout << "After: " << std::hex << ptr << std::dec << "\n";
}
 
Zuletzt bearbeitet:
Übrigens ist
Code:
void changePointer(int** f) {
	int p = 100;
	*f = &p;
eine ganz schlechte Idee, weil p als lokale Variable seine Gültigkeit verliert, sobald die Funktion changePointer verlassen wird. Der Wert an der Addresse von p ist danach also undefiniert.

Kleines Beispiel, mit clang ohne Optimierungen compiliert:
Code:
#include <stdio.h>

void changePointer(int** pointer) {
  int p = 100;
  *pointer = &p;
}

int computeNiceNumber(int a, int b) {
  int result = a * b;
  return result;
}

int main(int argc, char** argv) {
  int bla = 10;
  int* pointer = &bla;
  changePointer(&pointer);
  printf("%d\n", *pointer);                // Ausgabe: 100
  printf("%d\n", computeNiceNumber(5, 6)); // Ausgabe: 30
  printf("%d\n", *pointer);                // Ausgabe: 30
  return 0;
}

Also nie einen Pointer oder eine Referenz auf eine lokale Variable zurückgeben.
 
Zuletzt bearbeitet:
Zurück
Oben