Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Указатели в C.docx
Скачиваний:
4
Добавлен:
08.08.2019
Размер:
34.26 Кб
Скачать

Void main()

{

MyClass *pPointer;

pPointer = new MyClass;

pPointer->m_Number = 10;

pPointer->m_Character = 's';

delete pPointer;

}

Указатели на массивы

Вы также можете создавать указатели, которые указывают на массивы. Это делается так:

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 points to the value %d\n", *pArray);

}

Для того чтобы переместить указатель к следующему элементу массива, мы можем сделать pArray++. Мы также можем, как некоторые из вас могли уже догадаться, сделать pArray+2, что передвинет указатель сразу на 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 points to the value %d\n", *pArray);

pArray++;

printf("pArray points to the value %d\n", *pArray);

pArray++;

printf("pArray points to the value %d\n", *pArray);

}

Мы также можем двигать указатель в любую сторону, так pArray - 2 это 2 элемента от того места куда указывает указатель. Убедитесь, что вы добавляете и вычитает значение указателя а не у значения, на которое он указывает. Данный метод использования указателей и массивов более всего полезен при использовании циклов, таких как for или while.

Заметим так же , что если мы имеем указатель на значение, например int* pNumberSet, мы можем обращаться к нему как к массиву. Вот пример, pNumberSet[0] равно *pNumberSet; а pNumberSet[1] равно *(pNumberSet + 1).

Еще одно важное замечание по массивам состоит в том, что если мы выделяем память при помощи new, как в таком примере:

int *pArray;

pArray = new int[6];

...то выделенная таким образом память должна освобождаться следующей командой:

delete[] pArray;

Обратим внимание на [] после delete. Это указание компилятору о том, что удаляется целый массив, а не отдельный элемент. Мы должны использовать этот метод всякий раз при удалении массивов, иначе у нас возникнет утечка памяти.

Заключение

Последнее замечание: мы не должны удалять память, которую не выделили ранее с использованием new, как в следующем примере: