谁说过P指向“数组对象的副本”?
指针算术是在指向数组元素的指针的基础上定义的(参见C 2018 6.5.6 8和9)。为此,单个对象被视为一个元素的数组。因此,每当我们有任何非空对象指针时,在这个模型中,它都指向一个数组。
为什么P“以前”指向任何东西?也就是说,谁说我们改变了它的值?
你引用的文本是在说“为了确定E是否基于P,让我们假设复制P所指向的数组,并将指针分配给复制品中相应位置的P。”因此,你引用的文本是说我们正在改变P的值,然后我们将比较E的值与此更改和没有更改的值。
假设E是本地范围的指针。为什么修改E指针本身之外的任何指针表达式会“改变E的值”?它可能会改变E所指的值。对吗?
对象和值没有作用域。标识符有作用域。但是让我们考虑一个具有块级作用域的标识符:
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];
}
现在,无论
OnOrOff
是 true 还是 false,
E
的值会改变吗?不会,它将接收到作为引用元素的
A
的值,直接或通过复制。
P
可能指向
A
或
N
,但这并不影响
E
的值。 因此,这个
E
不是基于
P
。