- •Обзорные лекции по курсу
- •Int Temp[12] - {2, 4, 7, } ;
- •Int main ()
- •Разыменование указателей
- •Int main()
- •Void *ptr;
- •Int main ()
- •Int main ()
- •Int main ()
- •Void *malloc(size_t size);
- •Void *calloc( size_t num, size_t size );
- •Void free(void *block);
- •Int main(void)
- •Int* pRegion;
- •Void newHandler()
- •Int main()
- •Int main ()
- •Int strcmp(const char* strl, const char* str2)
- •Int stricmp(const char* strl, const char* str2)
- •Int strncmp(const char* strl,
- •Int strnicmp(const char* strl,
- •Void *malloc(size_t size);
- •Void *calloc( size_t num, size_t size );
- •Void free(void *block);
- •Int main(void)
- •Int* pRegion;
- •Int main ()
- •Упражнения для самопроверки
Разыменование указателей
Для того чтобы получить (прочитать) значение, записанное в некоторой области памяти, на которую ссылается указатель, используют операцию косвенного обращения, или разыменования (*). При этом используется имя указателя со звездочкой перед ним:
long double Num = 10;
long double Flag;
long double *ptr = &Num;
Flag = *ptr;
cout « Flag;
В приведенном фрагменте объявляются две переменные двойной точности Nun и Flag и указатель (ptr) на тип long double, проинициализированный адресом переменной Num. После этого посредством косвенного доступа к переменной Flag присваивается значение, хранящееся по адресу, указанному в ptr, то есть фактически значение переменной Num, что и подтверждает вывод на печать.
На практике довольно широко применяется так называемый пустой указатель (типа void), который может указывать на объект любого типа. Для получения доступа к объекту, на который ссылается указатель void, его необходимо предварительно привести к тому же типу, что и тип самого объекта.
Рассмотрим пример, иллюстрирующий использование пустого указателя.
#include <iostream.h>
Int main()
{
char Let = 'Т';
int nNum = 9;
Void *ptr;
ptr = &Let;
*(char*)ptr = 'L';
ptr = &nNum;
*(int*)ptr = 43;
cout « Let « ' \n';
cout « nNum;
return 0;
}
Сначала создаются два разнотипных объекта Let и nNum и пустой указатель ptr, который инициализируется адресом символьной переменной. Далее ptr разыменовывается, приводится к типу char* и посредством косвенной адресации модифицируется значение символа Let. Аналогичным образом указатель инициализируется значением адреса переменной nNum, приводится к целочисленному типу, после чего становится возможным изменение содержимого переменной nNum.
Доступ к элементам массива через указатели
Имя объявляемого массива ассоциируется компилятором с адресом его самого первого элемента (с индексом 0). Таким образом, можно присвоить указателю адрес нулевого элемента, используя имя массива:
char ArrayOfChar[] = {'W,'О','R','L','D'};
char* pArr = ArrayOfChar;
Разыменовывая указатель pArr, можно получить доступ к содержимому ArrayOfChar[0]:
char Letter = *pArr;
Поскольку в C++ указатели и массивы тесно взаимосвязаны, увеличивая или уменьшая значение указателя на массив, программист получает возможность доступа ко всем элементам массива путем соответствующей модификации указателя:
// pArr указывает на ArrayOfChar[0] ('W')
pArr += 3;
// pArr указывает на ArrayOfChar[3] ('L')
pArr++;
// pArr указывает на ArrayOfChar[4] ('D')
char Letter = *pArr; // Letter = 'D';
Таким образом, после проведенных арифметических операций указатель pArr будет ссылаться на элемент массива с индексом 4.
К этому же элементу можно обратиться иным способом:
Letter = *(ArrayOfChar + 4);
// Эквивалент Letter = ArrayOfChar[4];
Присвоение значений одного массива значениям другого массива вида Array [ ] = Another [ ] или Array = Another недопустимо, так как компилятор не может самостоятельно скопировать все значения одного массива в значения другого. Для этого программисту необходимо предпринимать определенные действия (при доступе к элементам по индексу чаще всего используется циклическое присвоение).
Объявление вида
char(*Array)[10];
определяет указатель Array на массив из 10 символов (char). Если же опустить скобки, компилятор поймет запись как объявление массива из 10 указателей на тип char. Рассмотрим пример использования массива.
#include <iostream.h>