При представлении выше объявления указателя, выделяется память для переменной типа указателя. Но сам указатель пока никуда не указывает. Рекомендуется проводить инициализацию указателя во время объявления.
int a;
int b=10;
В зависимости от контекста объявления память под указатель компилятор может выделить: в стеке (локальная переменная), в статической области данных (глобальная или статическая), heap (динамически независима от того, где находится сам объект).
int *p; //глобальная
{
int * p1; //локальная
static int * p2; //статическая
}
Инициализация указателя и оператор получения адреса объекта.
& - амперсант
Чтобы провести явную инициализацию указателя:
int n=1;
int *pn=&n;
int a[100];
int *pa=&a;
char *pstr=”string”;
char *pstr=&”string”;
Арифметика указателей.
int * p2;
p2=pn;
pn++;
pn=pn+sizeof(int);
p2=pn+5;
p2=pn+5*sizeof(int)
if (pn==p2)
Существует вид указателя на объекты любого типа:
void *;
void * pvoid;
int n;
char c;
int * pn;
pvoid=&h; // OK
pvoid=&c; //OK
pvoid=pn; //OK
reinterpret_cast
double d=99.99;
int n=d; //d=99
int n=0x12345;
char c=n;
int *pn=&n;
char *pc=reinterpret_cast
<char*> (&n);
Массивы.
Свойства массивов:
В памяти расположена совокупность упорядоченных элементов данных (последовательно).
Данные должны быть одного и того же типа.
Данные занимают непрерывно линейную область памяти.
Каждый массив имеет имя (оно является константным указателем, равным адресу начала массива, нулевого байта, нулевого элемента массива). Тип такого указателя зависит от размерности массива.
5. Доступ к отдельным элементам массива может осуществляться по имени массива и индексу (порядковый №) элемента или с помощью оператора <<*>> разыменовывания.
Объявление встроенного массива.
Без extern
Объявление совмещено с определением, поэтому программист должен предоставить компилятору информацию, сколько выделить памяти.