Программирование на языке C. Указатели и массивы

Все идентификаторы массивов на самом деле являются указателями, и все указатели могут адресовать массивы. Звучит странно? Чтобы разобраться, рассмотрим природу массива. Массив объединяет «под одной крышей» набор переменных одного типа. Если идентификатор collection означает массив, то выражение collection[0] — его первый элемент. В известном смысле выражение collection[0] является аналогией разыменованного указателя.

Дело в том, что идентификатор collection в действительности является указателем-константой. Он указывает на первый элемент массива и не может быть переадресован. В остальном он ничем не отличается от обычных указателей. Таким образом, выражение *collection обозначает то же самое, что и collection[0] — значение первого элемента массива.

Добавление единицы к указателю увеличивает его значение на величину того типа данного, которое он адресует. Если массив collection имеет тип int, то прибавление к нему единицы (collection + 1) увеличивает получаемое значение на 2 (т.к. размер типа int — 2 байта). Если бы массив имел значение long, то значение увеличилось бы на 4 и т.д. В любом случае выражение (collection + 1) является адресом второго элемента массива. Получаются следующие равенства:

*(collection + 1) == collection[1] /* то же значение */

collection + 1 == &collection[1] /* тот же адрес */

Не перепутайте *(collection +1) и Collection + 1. Последняя запись эквивалентна записи *collection) + 1.

*(collection + 1) /* значение второго элемента массива */

*collection +1 /* 1 добавляется к 1-ому элементу */

Стандарт С описывает систему обозначений массива в терминах указателей, т.е. выражение collection[n] при компиляции программы переводится в *(collection + n). Квадратные скобки — лишь для удобства программистов.

Выражение * (collection + n) можно понимать следующим образом: «Перейти к ячейке памяти с обозначением collection, переместиться на n единиц и осуществить здесь выборку значения».

Хотя обычно все эти подробности, касающиеся адресации массивов, оставляют компилятору, иногда бывает полезно взять на себя эту работу и использовать вместо индексов массивов указатели в явном виде.


2 Responses to "Программирование на языке C. Указатели и массивы"

  1. adler:

    много полезного почерпнул на сайте, и особенно в этой статье

  2. Алан Симский:

    Поднятая тема актуальна и познавательна, спасибо автору.

Leave a comment

[an error occurred while processing the directive]
[an error occurred while processing the directive]