Кто сказал, что P указывает на «копию объекта массива»?
Арифметика указателей определяется (в C 2018 6.5.6 8 и 9) в терминах указателей наэлементы массива.Для этой цели отдельный объект обрабатывается как массив из одного элемента.Таким образом, всякий раз, когда у нас есть какой-либо ненулевой указатель на объект, в этой модели он указывает на массив.
Почему P «ранее» указывал на что-либо?То есть кто сказал, что мы изменили его значение?
В цитируемом вами тексте написано: «Чтобы выяснить, основан ли E
на P
, давайте гипотетически сделаем копию массивачто P
указывает, а затем присваивает P
указатель на соответствующее место в копии. ”Таким образом, в цитируемом вами тексте говорится, что мы меняем значение P
, а затем мы сравниваем значениеE
с этим изменением и без него.
Предположим, E является указателем локальной области видимости.Зачем модифицировать любое выражение указателя, кроме самого указателя E, «изменить значение E»?Это может изменить значение, на которое указывает E.Правильно?
Объекты и значения не имеют области видимости.Идентификаторы имеют область применения.Но давайте рассмотрим идентификатор с областью действия блока:
// P is a pointer into A.
// S is the size of A.
// A is the start of an array not contained in any other array.
void foo(char *P, size_t S, char *A)
{
void *E = P+2;
}
Для иллюстрации предположим, что P
имеет значение 0x1004, а A
равно 0x1000.E
основано на P
?Ну, учитывая вышеизложенное, E
- это 0x1006.Предположим, что мы рассматриваем этот код перед определением E
:
char *N = malloc(S);
memcpy(N, A, S);
P = P - A + N;
Предположим, malloc
возвращает 0x2000.Каким будет значение E
?Это будет 0x2006.Это отличается от 0x1006.Поэтому E
основан на P
.
С другой стороны, учтите следующее:
void foo(char **P, size_t S, char **A)
{
#if OnOrOff
char *N = malloc(S);
memcpy(N, A, S);
P = P - A + N;
#endif
char **E = P[3];
}
Теперь значение E
изменится в зависимости от того, OnOrOff
это правда или ложь?Нет, в любом случае он получит значение, являющееся ссылочным элементом A
, напрямую или из копии.Тот факт, что P
может указывать на A
или N
, не влияет на значение E
.Так что это E
не основано на P
.