关于C中用“restrict”限定的指针的问题

问题描述 投票:0回答:1

C11 6.7.3.1:

1 设 D 是一个普通标识符的声明,它提供了 指定的手段 对象 P 作为指向类型 T 的限制限定指针。

2 如果 D 出现在块内并且没有存储类 extern,则令 B 表示 堵塞。如果 D 出现在函数定义的参数声明列表中,则令 B 表示关联的块。否则,令 B 表示 main 块(或 在独立环境中程序启动时调用的任何函数)。

3 在下文中,指针表达式 E 被称为基于对象 P 如果(在某些情况下) 在评估 E) 之前执行 B 的序列点将 P 修改为指向 它以前指向的数组对象的副本将更改 E 的值。137) 请注意,“based”仅针对具有指针类型的表达式定义。

4 在 B 的每次执行期间,令 L 为任何具有基于 P 的 &L 的左值。如果 L 用于 访问它指定的对象 X 的值,并且 X 也被修改(通过任何方式), 那么以下要求适用: T 不应被 const 限定。每个其他左值 用于访问 X 的值也应具有基于 P 的地址。 每次访问 就本子条款而言,修改 X 也应被视为修改 P...

137) 换句话说,E 取决于 P 本身的值,而不是通过 P 间接引用的对象的值。例如,如果标识符 p 具有类型 (int **restrict),则指针表达式 p 和p+1 是基于 p 指定的受限指针对象,但指针表达式 *p 和 p[1] 不是基于。

根据这句话,我构思了一段代码:

int main() 
{    
    int  A = 5;   
    int* restrict P;
    P = &A;           
    *P = 10;
    int *N = P; 
    *N = 20;
}

我的疑问来自这句话“就本子条款而言,修改 X 的每个访问也应被视为修改 P。

首先,我认为这段代码是严格符合标准的,不存在未定义的行为。

其次,

*N
属于“每次修改X的访问”,这和修改
P
有什么关系?
P
是一个指针对象,
X
是它指向的对象。修改指针指向的对象也算修改指针吗?

以上是我的问题。 感谢您的阅读。

c language-lawyer c11
1个回答
0
投票

我找到了答案在这里......

© www.soinside.com 2019 - 2024. All rights reserved.