Указатели и Линки
В языке C++ очень часто используют указатели и ссылки на переменную.
Понятие указателя
Указатель — это переменная. Такая же, как и любая другая. У нее есть свое значение и свой адрес в памяти. Переменная-указатель объявляется также, как и любые другие переменные, но после имени типа ставится звездочка - *. Чтобы объявить переменную следует указать ее тип, а затем имя. Звездочка является частью типа, а не частью имени.
Пример:
int *a;//0x1
А можно и так:
int* a1; //0x1
int * a2;//0
int *a3; //0x17
Чтобы получить адрес переменной, нужно перед ее именем написать амперсанд - &.
#include <iostream>//Подключаем cin и cout и др.
using namespace std;//Пространство имён
int main()
{
setlocale(0,"");//Кириллица
int a=123;
int *b=&a;
cout << "Значение а=" << a << endl;//123
cout << "Адрес а=" << b << endl; //0x22fe34
cout << "Адрес а=" << &a << endl;//0x22fe34
cout << "Опять значение а=" << *b << endl;//123
system("pause");//Задержка
return 0;//Возвращаем числовое значение
}
Адресная арифметика
К указателям можно прибавлять или отнимать числа и как бы перемещать адрес вперед или назад. На основе этого сделана адресация в массиве, так как массив - это непрерывная информация в памяти, расположенная последовательно.
#include <iostream>//Подключаем cin и cout и др.
using namespace std;//Пространство имён
int main()
{
setlocale(0,"");//Кириллица
int array[5] = {1,2,3,4,5};//Массив в пять элементов
int *p=&array[0];//или так: int *p = array;
p++;
cout << *p << endl;//2
p+=3;
cout << *p << endl;//5
system("pause");//Задержка
return 0; //Возвращаем числовое значение
}
Имя массива — это указатель на его начало - точка отсчета. Строки: int *p=&array[0]; и int *p = array; равнозначны.
Код функции, которая меняет местами две переменные.
...
void swap(double* a, double* b)
{
double temp=*a;//Временная переменная
*a=*b;
*b=temp;
}
...
swap(&x, &y);
...
Понятие ссылки
В языке C++ появился новый механизм работы с переменными — ссылки.
Конструкция double name& объявляет ссылку на переменную типа double. При таком объявлении функции в стек будут положены не значения переменных, а их адреса. Ссылка — это указатель, с которым можно работать, как с обычной переменной.
Различия между ссылкой и указателем: Ссылка не может быть равна NULL, а указатель может. Ссылка не может быть непроинициализирована, а указатель может.
...
void swap(double& a, double& b)
{
double temp=a;
a=b;
b=temp;
}
...
swap(x, y);
...