Wie unter "Pointer" schon angesprochen, sind Pointer einfache Integer deren Wert eine Speicheradresse ist. Hinter dieser Speicheradresse liegt die Variable, auf die der Pointer zeigt. Da sich mit einfachen Integern rechnen lässt, trifft dies auch auf Pointer zu. Allerdings funktionieren die Dinge hier ein wenig anders. Zunächst ein Beispielcode:

#include 
#include 

void print_arr(int arr[], int len)
{
	printf("arr = {");
	for (int i = 0; i < len; i++) {
		printf("%d, ", arr[i]);
	}
	printf("}\n");
}

int main()
{
	int n = 16;
	int *arr = (int *)calloc(n, sizeof(int));

	for(int i = 0; i < n; i++) {
		arr[i] = i;
	}
	print_arr(arr, n);

	int a = arr[4];
	int *p_arr = arr;
	int *p_arr_5 = p_arr + 4;
	int b = *p_arr_5;
	printf("a = %d | b = %d\n", a, b);

	int c = arr[7];
	int d = *(arr + 7);
	printf("c = %d | d = %d\n", c, d);

	printf("arr = %p | %p = %p\n", arr, &arr[7], arr + 7);

	printf("sizeof(int) = %zd | sizeof(char) = %zd\n", sizeof(int), sizeof(char));

	int m = 12;
	char *c_arr = (char *)calloc(m, sizeof(char));

	printf("c_arr = %p | %p = %p\n", c_arr, &c_arr[7], c_arr + 7);

	free(arr);
	free(c_arr);

	return 0;
}
Wir blenden für die Erklärung die print_arr Funktion aus. Die gibt uns nur ein Array auf der Komandozeile aus.


Zunächst wird ein Array auf dem Heap angelegt. Dieses Array besteht aus n Element mit sizeof(int) Bytes Größe. Die For-Schleife initialisiert jedes Element des Arrays auf seinen Index, damit eine spätere Ausgabe besser lesbar wird. print_arr gibt das Array dann aus.

Der folgende Block zeigt, wie Pointer-Arithmetik funktioniert. Hier wird + 4 auf einen Pointer gerechnet. Diese Berechnung erhöht die Speicheraddresse in arr aber nicht um 4 Byte sondern um 4 Elemente. Da wir ein Array von Integern haben ist die Größe 4. Die Speicheraddresse wird also tatsächlich um 4*4 = 16 Byte erhöht. 

C unterstützt uns bei der Berechnung indem es uns den []-Operator anbietet. Der folgende Block mit c und d Zeigt, dass beide Ausdrücke äquivalent sind. Die Zugriffe auf Elemente eines Arrays erfolgen in C also immer über Pointer-Arithmetik. 

Zuletzt geändert: Freitag, 18. Mai 2018, 16:24