Тема 9. Указатели Переменные и их адреса
Указатель – это переменная, содержащая адрес другой переменной, но перед тем, как переходить непосредственно к программированию, рассмотрим пример из жизни. Приглашая друга в гости, мы сообщаем ему адрес своего дома; друг записывает адрес на листок бумаги, и этот листок становится указателем на наш дом. По этому указателю любой человек может найти дом, и нам не нужно показывать другу сам дом, например, «приносить его с собой». Таким образом, указатель – это предмет (листок бумаги), содержащий адрес, по которому можно найти другой предмет (дом). Особую выгоду при использовании указателей можно получить в тех случаях, когда предмет, куда указывает указатель большой в каком-либо смысле.
Теперь постараемся понять, что такое адрес переменной. В памяти компьютера переменные хранятся в ячейках, которые имеют свой адрес, представляющий собой номер этой ячейки; чтобы узнать этот номер следует воспользоваться операцией & (амперсанд):
int m=10, n=20, k=30;
float x=12.1, y=45.8, z=67.9;
char a='T', b='*', c=';';
printf("-------------------------------\n");
printf("Имя\tЗначение\tАдрес\n");
printf("-------------------------------\n");
printf("%s\t%d\t\t%d\n", "m", m, &m);
printf("%s\t%d\t\t%d\n", "n", n, &n);
printf("%s\t%d\t\t%d\n", "k", k, &k);
printf("%s\t%g\t\t%d\n", "x", x, &x);
printf("%s\t%g\t\t%d\n", "y", y, &y);
printf("%s\t%g\t\t%d\n", "z", z, &z);
printf("%s\t%c\t\t%d\n", "a", a, &a);
printf("%s\t%c\t\t%d\n", "b", b, &b);
printf("%s\t%c\t\t%d\n", "c", c, &c);
printf("-------------------------------\n");
Заметим, что обращаясь к переменной по имени, мы фактически обращаемся к ячейке памяти, названной этим именем. Тем не менее, для обращения к ячейке памяти не обязательно знать ее имя, а достаточно знать ее адрес. Например, чтобы пригласить человека на концерт, можно посоветовать ему прийти в Оперный театр, а можно отправить его по адресу Красный проспект, 36 (это адрес Оперного театра). Таким образом, можно провести следующую аналогию:
Ячейка памяти |
Земля, где находится театр |
Имя переменной |
Оперный театр |
Адрес переменной |
Красный проспект, 36 |
Значение переменной |
Здание театра |
Описание указателя
Несмотря на то, что адрес или, другими словами, номер ячейки памяти является числом, его нельзя хранить в обычной целочисленной переменной, например, следующий фрагмент кода приведет к ошибке во второй строке:
Для хранения адресов переменных предусмотрены указатели, которые объявляются с использованием символа * (звездочка). Хорошим стилем программирования является использование префикса p_ или ptr_ для имен указателей; это соглашение связано с переводом слова указатель на английский язык – pointer. Подходящими именами для указателей могут быть, например, ptr_x или p_number.