- 论坛徽章:
- 2
|
回复 13# sagasw
那个帖子主要说的是数组。
对数组: T A[N];
1. &A[i ] ( 0<=i && i<=N) 产生的都是合法的指针值。
2. &A[i ] i==N 指针值合法, 但不可解引用
3. &A[i ] ( 0<=i && i<N ) 合法, 且分别引用数组的所有元素
4. 在这些合法的指针 p 的基础上, 可以由 p + offset 得到新的指针值
若 p + offset 的结果在1的范围内, 是有良好定义的, 不会溢出。
若 p + offset 超出1的范围, 是未定义行为
例如:
int a[3];
*(&a[0]), *(&a[1]), *(&a[2]), (&a[3]) 都是合法的; &a[4]未定义
*(&a[0]+0), *(&a[0]+1), *(&a[0]+2), (&a[0]+3]) 也是合法的; &a[0]-1, &a[0]+4, 未定义
*(&a[1]-1), *(&a[1]+0), *(&a[1]+1), (&a[1]+2) 合法; &a[1]-2, &a[1]+3, 未定义
...
如果将 int i; 理解为一个维度为1的数组(这个需验证) int a[1];
&i+1 即 &a[0]+1 是合法的
&i+2 即 &a[0]+2 是无定义的 |
|