Я видел следующий пример на cppreference.
void f(int n, int * restrict p, int * restrict q)
{
while(n-- > 0)
*p++ = *q++; // none of the objects modified through *p is the same
// as any of the objects read through *q
// compiler free to optimize, vectorize, page map, etc.
}
void g(void)
{
extern int d[100];
f(50, d + 50, d); // OK
f(50, d + 1, d); // Undefined behavior: d[1] is accessed through both p and q in f
}
В этом примере звонить f(50, d + 50, d);
можно.
Но я не понимаю, звонить f(50, d + 1, d)
; является неопределенным поведением. Почему?
d[1]
в функцииf
осуществляется как черезp
, так и черезq
. комментарий говорит об этом. - person Eugene Sh.   schedule 22.11.2017f
оба указателя ограничены, но указывают на один и тот же объект в разное время. - person Eugene Sh.   schedule 22.11.2017d
- это массив.d[0]
— элемент массива. - person Eugene Sh.   schedule 22.11.2017