Pointer in C++
Basic concepts
A pointer contains the memory address of a variable.
// Declare a pointer to a int variable. int *pnPtr;
Address-of operator: &
Store the address of a variable in a pointer, by using the address of operator:
// From value to pointer int nValue = 42; int *pnPtr = &nValue;
Dereference operator: *
Given a pointer, retrieve the value.
cout << *pnPtr;
Null-Pointer
int *pnPtr = 0; // also possible, but this is C int *pnPtr = NULL;
Used in an if condition:
if (pnPtr) cout << "pointer not null"; else cout << "null-pointer";
Size of a pointer depends on the underlying OS/system (32/64 bit ⇒ 4 byte/8 byte).
Pointer and Arrays
An array is a pointer which refers to the first element of an array.
int anArray[3] = {3, 5, 7}; cout << *anArray; // Gibt erstes Element "3" zurück
Pointer arithmetic
If pnPtr points to an integer, pnPtr + 1 is the address of the next integer.
pnPtr + 1 does not return the address + 1, instead it returns the address of the object of the type pnPtr points to.
Example.: pnPtr points to an integer (4 bytes) pnPtr + 2 means 2 integers after pnPtr, which results in 8 adresses after pnPtr.
The data type size can be returned with sizeof()
.
Scaling: The compiler multiplies the integer operand with the size of the object which is pointed to.
Array example:
Given the following example:
int anArray[3] = {3, 5, 7};
anArray is a pointer to anArray[0] (it is &anArray[0]). anArray + 1 is a pointer to anArray[i].
Access to the second element of the above array:
int anArray[3] = {3, 5, 7}; cout << *(anArray + 1); // Returns element "5"
Dynamic memory allocation
Einzelne Variablen
int *pnValue = new int;
new-Operator allocates space on the heap and returns the address of the variable which was allocated.
Release allocated memory
delete pnValue; // Delete memory on which the pointer points pnValue = 0; // Set null pointer
Arrays
// Speicher allokieren int *pnArray = new int[10]; // Freigeben delete[] pnArray; pnArray = 0;
Multidimensional arrays
Since an array is a pointer, a array of array can be seen as a pointer to pointers.
A 2dimensional array can declared as follows:
int x = 5; int y = 5; // int* arr would declare a pointer to a array of ints int** arr = new int*[x]; // declares a pointer to an array of pointers for(int i = 0; i < x; ++i) arr[i] = new int[y];
http://stackoverflow.com/questions/8767166/passing-a-2d-array-to-a-c-function
const
Konstanter Pointer:
int nValue = 1; int *const pnPtr = &nValue;
nValue ist nicht konstant, und Wert von nValue kann mit *pnPtr = 2 geändert werden.
Referenzen
Konstante, die als Alias für eine andere Variable dient
int nValue = 5; int &rnRef = nValue; nValue++; cout << rnRef; // 6
Konstante (Const) Referenzen verbieten Änderung des Wertes der Referenz
const int &rnRef = nValue;
Member Selection
(*psSomething).nValue = 5; psSomething->nValue = 5;
Function pointer
// Pointer f to a function, which returns void and has no parameters void (*f) (void) // Pointer f to a function, which returns a void pointer and has a void pointer as parameter void *(*f)(void *) // Function can be called like this: f(); // Pointer func2, which returns a pointer to a char and takes a pointer to a const char and an int as a parameter. char * (*func2)(const char *, int) = strchr;