Еще одним составным типом являются указатели. Подобно ссылкам, указатели используют для косвенного доступа к объектам. В отличие от ссылок, указатель - настоящий объект.
Указатели можно присвоить и скопировать, один указатель может за время своего существования указывать на несколько разных объектов. В отличие от ссылки, указатель можно не инициализировать в момент определения.
В определении указателя используется оператор в форме *имя
int *point1, *point2;
double *point3; //все три указателя неопределенны
Указатель содержит адрес другого объекта. Для получения адреса объекта используется оператор обращения к адресу &
int count = 10;
int *point1 = &count; // point1 содержит адрес
// *point1 содержит значение
Поскольку ссылки не являются объектами, у них не адресов, и невозможно определить указатель на ссылку.
Тип указателя и объекта должны совпадать.
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int num1 = 10, num2 = 25;
int *pointer1 = &num1; //указатель на num1
int *pointer2 = &num2; //указатель на num2
*pointer1 = 5; //num1 теперь равен 5
*pointer2 = 15;
pointer2 = &num1; //указатель теперь указывает на num1
cout << "num1: " << num1
<< "\nnum2: " << num2
<< "\npointer1: " << pointer1
<< "\npointer2: " << pointer2
<< "\n*pointer1: " << *pointer1
<< "\n*pointer2: " << *pointer2 << endl;
return 0;
}
Результат программы:
num1: 5
num2: 15
pointer1: 0x770fded25cdc
pointer2: 0x770fded25cdc
*pointer1: 5
*pointer2: 5
Важно понять, что самим указателям можно передать только адрес, а изменять значения можно только при обращении через звездочку.