Указатели на массивы
Имя массива можно рассматривать как указатель на его первый элемент.
Пример:
int v[] = { 1,2,3,7 }; int *p1 = v; // Указатель на первый элемент int *p2 = &v[0]; // Указатель на первый элемент int *p3 = &v[4]; // Указатель на элемент, следующий за последним В противоположность указателю на массив, определение массива указателей выглядит следующим образом:
int *ap[15]; // Массив из 15 указателей на int
Результат применения операторов -, +, --, ++ к указателю зависит от типа объекта, на который ссылается указатель. Если к указателю p типа T* применяется арифметическая операция, предполагается, что он указывает на элемент массива объектов типа Т; p+1 указывает на следующий элемент массива, а p-1 на предыдущий. То есть целое значение p+1 будет на sizeof(T) больше, чем целое значение р.
Рассмотрим пример обнуления элементов массива с использованием индексов int arr[ArraySize]; for (int i=0; i < ArraySize; ++i) arr[i] = 0; и с использованием указателей: int arr[ArraySize]; int *p=arr; for (int i=0; i < ArraySize; ++i) *p++ = 0; //{*p=0; p++;}
Интересна запись *p++. Унарные операторы * и ++ имеют одинаковый приоритет, однако они правоассоциативны. То есть в данном случае первым будет выполняться оператор ++, увеличивающий значение указателя. Указатель будет сдвинут на следующий элемент массива. Но поскольку это оператор постинкремента, то для разыменования будет использовано старое значение указателя. Таким образом, в одном выражении записано сразу два действия: передвинуть указатель и разыменовать указатель. В объект, на который указывает указатель, помещается ноль.
|