@IslamuMilana

Указатель или Индекс элемента?

Зачем использовать указатель на элемент в массиве, или можно просто указать индект элемента в квадратных скобках?
[ ]

имею ввиду, зачем делают так *p+1 для доступа к следующиму элементу, а не p[1]?
  • Вопрос задан
  • 414 просмотров
Решения вопроса 3
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Потому что работа с указателями более гибкая, чем использование индексов массива. Указатели - это одна из фишек языка С, если ее не понимать - будет очень сложно на нем писать.
Ответ написан
@res2001
Developer, ex-admin
имею ввиду, зачем делают так *p+1 для доступа к следующиму элементу, а не p[1]?

Вообще то ничего общего между приведенными операциями нет (смотрите приоритет операций):
*p+1 == (*p) + 1
p[1] == *(p+1)


Но вопрос в целом понятен, не взирая на ошибку в примере.
Надо смотреть на контекст. Часто бывает, что код не ограничивается одноразовым применением p[1], а например есть целая серия обращений к p[1], в этом случае будет экономия на операциях, если вы сначала вычислите адрес p[1], а в дальнейшем будете использовать простое разыменование этого адреса. Будет ли реально выигрыш во времени исполнения зависит от компилятора, в целом думаю, современные компиляторы в состоянии сами сделать подобную оптимизацию.
Ответ написан
Комментировать
BacCM
@BacCM
C++ почти с рождения
Квадратные скобки это более удобный и читабельный вариант записи
a[i] обозначает ровно *(a+i)

Поэтому законен и валиден код

1[a] = 42;

Для обращения в первому элементу массива например.

Иногда нет необходимости аводить отдельную переменную для индекса, и тогда код без скобок может быть предпочтительнее:

size_t i = 0;
while (a[i] != 0) {
  a[i] = 3;  /// <- тут если без оптимизации лишняя операция с индексами :)
  ++i;
}

// или

while (*a != 0) {
  *a = 3;
  ++a;
}
// правда тут надо понимать, что a изменилась после цикла
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы