Таким образом, запись массива является действительно синтаксическим сахаром над арифметикой указателя. В вашем коде:
p[1] = 30.0;
Можно также записать как
*(p + 1) = 30.0;
Точно так же, если вы хотите «вычесть 10.0 из последнего элемента массива через указатель, используя обозначение указателя»
Вы бы сделали это:
double *p = arr
*(p + 3) -= 10.0
Пояснение:
Когда вы объявляете массив, вы объявляете серию значений, хранящихся в непрерывной памяти (это означает блоки памяти рядом друг с другом). Причина, по которой вы можете получить доступ к различным элементам этого массива, заключается в том, что вы знаете
- Где начинается массив
- Как далеко вы хотите продвинуться
На самом деле, обозначение массива arr[2]
(где arr
- массив double
s) означает «Перейти к адресу памяти массива arr
, двигаться по 2 * sizeof(double)
, затем дать нам сохраненное значение достаточно забавно, это именно то, что означает *(p + 2)
, только оно разбито - бит внутри скобок означает «двигаться вдоль 2», а звезда («оператор разыменования») означает, что мы получаем значение.