====== 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;