В этом утверждении
int* arr = malloc(size*sizeof(int));
функция таНос выделяет степень памяти, которая способна хранить size
объектов типа int
и возвращает указатель в такой степени (или до первого временного интервала в той степени, где объект тип int может быть размещен) как имеющий тип void *
, который неявно преобразован в тип int *
, поскольку в левой части идентификатора декларации arr
имеет тип int *
.
Согласно стандарту C (6.5.2.1 индексация массивов)
2 ... Определение оператора индекса [] является то, что E1 [E2] является идентичными (* ((E1) + (E2))). Из-за правил преобразования, которые применяется к двоичному оператору +, если E1 является объектом массива (эквивалентно указателю на исходный элемент объекта массива) и E2 является целым числом, E1 [E2] обозначает E2- го элемента E1 (с нуля).
Таким образом, это выражение
arr[i]
оценивается как
*(arr + i)
где в подвыражению
arr + i
там используется указатель арифметики, это выражение указывает на I -й элемент в выделенном ex палатка памяти.
Если у вас есть массив, объявленный, например, как
int array[size];
то в этом выражении
array[i]
имя массива неявно преобразуется в указатель на его первый элемент.Вы можете представить это, как
int *p = array;
*(p + i)
Таким образом, если у вас есть следующие объявления
int array[size];
int *p;
то следующие утверждения эквивалентны
array[1] = 10;
и
p = array;
*(p + 1) = 10;
Becuase операция array + i
коммутативности, то вы можете написать взаимозаменяемые
array[i]
и
i[array]
Например, в вашей функции вы могли бы написать
i[arr] = ll->value;
Хотя бы только запутать читателей. :)
Начинающие всегда удивляются, если посмотреть код, подобный этому
int a[10];
0[a] = 5;
Спасибо. Я ценю ваше подробное объяснение! Я понимаю это сейчас. – wiwen
Мое удовольствие. Спасибо * вы * :) – FoggyDay