Указатели для начинающих (Pointers) - Указатели на массивы
ОГЛАВЛЕНИЕ
Указатели на массивы
Вы также можете создавать указатели, которые ссылаются на массивы и делается это следующим образом:
int *pArray;
pArray = new int[6];
Это создаст указатель pArray, и он будет указывать на массив из шести элементов. Другой метод, который не будет использовать динамическое распределение, выглядит так:
int *pArray;
int MyArray[6];
pArray = &MyArray[0];
Заметьте, что вместо того, чтобы писать &MyArray[0], вы можете просто написать MyArray. Это, конечно, применяется только по отношению к массивам и является результатом того, как они реализуются на языке C/C++. Частой ошибкой является написание pArray = &MyArray; - это неверно. Если вы напишите это, то у вас будет указатель на указатель на массив (без ошибок), но вам это совсем не нужно.
Использование указателей на массивы
Как только у вас будет указатель на массив, допустим это указатель на массив со значениями типа int - то указатель будет указывать на первое значение массива, как демонстрирует следующий пример:
#include <stdio.h>
void main()
{
int Array[3];
Array[0] = 10;
Array[1] = 20;
Array[2] = 30;
int *pArray;
pArray = &Array[0];
printf("pArray указывает на значение %d\n", *pArray);
}
Для того, чтобы указатель перешел на следующее значение в массиве, мы можем применить pArray++. Мы также можем, как вы наверняка поняли, написать pArray + 2, что передвинет указатель на два элемента. Вам стоит быть осторожным, чтобы не перейти за границу массива (в данном случае это 3-е значение), поскольку компилятор не может проверить вышли ли вы за границы в случае, если вы используете указатели. Вы можете привести систему к полному отказу. Данный пример демонстрирует все три значения, которые мы устанавливали:
#include <stdio.h>
void main()
{
int Array[3];
Array[0] = 10;
Array[1] = 20;
Array[2] = 30;
int *pArray;
pArray = &Array[0];
printf("pArray указывает на значение %d\n", *pArray);
pArray++;
printf("pArray указывает на значение %d\n", *pArray);
pArray++;
printf("pArray указывает на значение %d\n", *pArray);
}
Вы также можете вычитать значения, тем самым pArray - 2 приведет вас на 2 элемента назад относительно той позиции, куда указывает текущее значение pArray. Тем не менее, удостоверьтесь, что вы добавляете и вычитаете из указателя, а не из его значения. Данная манипуляция, использующая указатели и массивы, наиболее полезна при использовании циклов, таких как while.
Заметьте, что если у вас есть указатель на значение, то есть int* pNumberSet, то вы можете обращаться к нему как к массиву. К примеру, pNumberSet[0]эквивалентно *pNumberSet; аналогично pNumberSet[1] эквивалентно *(pNumberSet + 1).
Последнее, о чем мы вас хотим предупредить относительно массивов, заключается в том, что если вы распределяете памятть для массива используя new, как это показано в следующем примере:
int *pArray;
pArray = new int[6];
...то он должен быть удален посредством следующей команды:
delete[] pArray;
Заметьте квадратные скобки [] после delete. Это указывает компилятору на то, что удаляется весь массив, а не один его элемент. Вы должны использовать данный метод в случаях, когда вы используете массивы, в противном случае у вас будет наблюдаться утечка памяти.
Послесловие
Последняя заметка - вы должны удалять память, которую вы не распределяли, следующим образом:
void main()
{
int number;
int *pNumber = number;
delete pNumber; // неверно - *pNumber не был расположен посредством команды new.
}