谁说 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
.