Программирование на C и C++

Онлайн справочник программиста на C и C++

Операторы указания & и *

Указатель - это адрес переменной в памяти. Указатель на переменную - это переменная, специально созданная для хранения указателя на объект определенного типа. Зная адрес переменной, можно существенно упростить работу некоторых программ. Указатели имеют три главных назначения в С:

  1. Предоставляют быстрое обращение к элементам массива.
  2. Позволяют функциям модифицировать передаваемые параметры.
  3. Поддерживают динамические структуры данных, например списки.

Оператор &. Это унарный оператор, возвращающий адрес операнда в памяти. (Унарному оператору требуется только один операнд.) Например:

m = &count;

помещает в m адрес переменной count. Это адрес внутреннего местоположения переменной в компьютере. С самим значением переменной ничего не делается. Оператор & можно запомнить как «взятие адреса». Поэтому вышеупомянутый оператор присваивания можно прочитать как «m получает адрес count».

Для лучшего понимания данного присваивания предположим, что переменная count находится по адресу 2000. Также предположим, что count имеет значение 100. После данного присваивания m будет содержать 2000.

Оператор *, дополняющий &. Это унарный оператор, возвращающий значение переменной по указанному адресу. Например: если m содержит адрес переменной count, то

q = *m;

помещает значение count в q. Следуя вышеприведенному примеру, q получит значение 100, поскольку 100 хранилось по адресу 2000 - адресу, находящемуся в переменной m. Операция * может быть запомнена как «по адресу». В данном случае оператор можно прочитать как «q получает значение по адресу m».

К несчастью, значки для умножения и для взятия «по адресу» - одинаковы, впрочем как и значки битового И и «взятие адреса». Эти операторы не имеют связи друг с другом. Как & так и * имеют более высокий приоритет по сравнению с остальными арифметическими операциями, за исключением унарного минуса, имеющего такой же приоритет.

Переменные, содержащие адреса или указатели, должны объявляться путем помещения * перед именем переменной для указания компилятору того, что переменная содержит указатель. Например, для объявления указателя ch на символ, следует написать

char *ch;

Здесь ch - это не символ, а указатель на символ, в чем и заключается принципиальное различие. Тип данных, на который указывает указатель, как в нашем случае char, называется базовым типом указателя. Сам указатель - это переменная, используемая для хранения адреса объекта базового типа. Следовательно, указатель на символ (или любой другой указатель) имеет фиксированный размер, определяемый архитектурой компьютера, для хранения адреса. Важно запомнить, что указатель следует использовать только для указания на типы данных, совпадающие с базовым типом.

Можно смешивать объявление указателей и обычных переменных в одной строке. Например:

int х, *у, count;

объявляет х и count как переменные целочисленного типа, а у - как указатель на целочисленный тип.

Ниже операторы * и & используются для занесения числа 10 в переменную target:

#include <stdio.h>

/* присвоение с помощью * и & */

int main(void)

{
 int target, source;
 int *m;

source = 10;
m = &source;
target = *m;

printf("%d", target);

return 0;
}