когда массив действует как указатель в c? - PullRequest
2 голосов
/ 07 октября 2011

Я знаю, что имя массива можно использовать как указатель (хотя это преобразованная форма), но мой вопрос: есть ли какой-то другой пример, когда массив действует как указатель.

Ответы [ 5 ]

13 голосов
/ 07 октября 2011

Технически говоря, имя массива никогда не действует как указатель. выражение с типом массива (которое может быть именем массива) преобразует к указателю в любое время тип массива не является допустимым, но тип указателя является. И объявление массива в качестве параметра функции преобразуется в объявление указателя. (Это означает, что название не является имя массива, но имя указателя. Несмотря на внешность.)

1 голос
/ 07 октября 2011

Вот соответствующие разделы стандарта языка C (вы запросили C, вот что вы получите):

6.3.2.1 L-значения, массивы и обозначения функций
...
3 За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или строковый литерал, используемый для инициализации массива, выражение, которое имеет тип ‘‘ array of type ’’ преобразуется в выражение с указателем типа 101 ‘на тип ’, которое указывает на начальный элемент объект массива и не является lvalue. Если объект массива имеет класс хранения регистров, поведение не определено.
...
6.5.2.1 Массив подписки

Ограничения

1 Одно из выражений должно иметь тип ‘‘ указатель на объект тип ’’, другое выражение должно имеют целочисленный тип, а результат имеет тип ‘‘ type ’’.

Семантика

2 Выражение с постфиксом, за которым следует выражение в квадратных скобках [] обозначение элемента объекта массива. Определение индекса оператора [] является то, что E1[E2] идентичен (*((E1)+(E2))). Из-за правил преобразования, которые применяется к бинарному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта массива) и E2 является целым числом, E1[E2] обозначает E2 элемент E1 (считая с нуля).
...
6.7.5.3 Объявления функций (включая прототипы)
...
7 Объявление параметра в виде массива type ’должно быть скорректировано, чтобы указывать квалифицированный указатель на type ’’, где квалификаторы типа (если таковые имеются) указаны в [ и ] вывод типа массива. Если ключевое слово static также присутствует в пределах [ и ] вывод типа массива, затем для каждого вызова функции значение соответствующего фактический аргумент должен обеспечивать доступ к первому элементу массива с как минимум элементы, указанные в выражении размера

Важно отметить, что между объектом (в смысле C, который занимает память) и выражением, которое мы используем для ссылки на этот объект, есть разница. Массивы всегда являются массивами, но выражение , используемое для ссылки на этот объект, часто будет иметь тип указателя.

0 голосов
/ 07 октября 2011
The identifier itself tells the base address of the memory block.

int arr[SIZE];

 arr
+------+------+----       ----+------+
|      |      |     . . .     |      |
+------+------+----       ----+------+
 arr[0] arr[1]  arr[2]  arr[n-1] arr[n]



The `arr' holds the address of the base address of the block

int *arr = malloc (sizeof (int) * SIZE);

 arr
+------+
|addr1 |------------+
+------+            |
addr_of_arr         |
                    |
                    |
                    V
                  +------+------+----       ----+------+
                  |      |      |     . . .     |      |
                  +------+------+----       ----+------+
                  addr1[0] addr[1]    addr1[n-1] addr1[n]
0 голосов
/ 07 октября 2011

Массивы в C - это просто указатели, которые резервируют последовательные блоки памяти. По сути, массивы всегда действуют как указатели.

0 голосов
/ 07 октября 2011

Это связано с стандартным преобразованием массива в указатель . В частности, массив превращается в указатель на первый элемент массива.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...