Использование такого рода арифметических указателей c является плохой практикой кодирования, так как это может привести к значительной куче трудных для отладки проблем.
Мне приходилось использовать подобные вещи только один раз в более 20 лет. Я писал функцию обратного вызова, но у меня не было доступа к нужным данным. Вызывающая функция предоставляла указатель внутри правильного массива, и мне был нужен байт непосредственно перед этим указателем.
Учитывая, что у меня был доступ ко всему исходному коду, и я проверил поведение нескольких раз, чтобы доказать, что я получаю то, что мне нужно, и я проверил это у других коллег, я решил, что можно разрешить go запустить в производство.
Правильным решением было бы изменить функцию вызывающего абонента. вернуть правильный указатель, но это было невозможно, учитывая время и деньги (эта часть программного обеспечения была лицензирована от стороннего производителя).
Итак, a[-1]
возможен, но должен использоваться ТОЛЬКО с очень хорошей заботой в очень специфических ситуациях. В противном случае, нет веских оснований для такого рода причинения вреда Вуду.
Примечание: при надлежащем анализе, в моем примере, очевидно, что я не получил доступ к элементу до начало правильного массива, но элемент перед указателем, который гарантированно находится внутри того же массива.
Ссылаясь на предоставленный код:
- это НЕ ОК, чтобы использовать p [-1] с
reverse(a);
; - Нормально (-i sh) использовать его с
reverse(a+1);
, потому что вы остаетесь внутри массива.