使用指向单个值的指针作为数组
use pointer to single value as Array
(请注意,问题已针对 "register" 个变量进行了扩展)
简而言之,我的问题是:这是合法的 C 代码吗(根据不同 ISO 9899 C 的标准的字母 - 理想情况下 "proof" 按照标准的话):
int a = 0;
int b = (&a)[0];
const int c = 0;
b = (&c)[0];
问题扩展:
by Jens Gustedt表示不允许取寄存器变量的地址。这是真的?是否还可以提供标准中的其他引用来对此进行推理?
/* Question extension */
register int d = 0;
int e = (&d)[0];
背景:
我有一组数组表示结构化对象集合的属性——每个属性一个数组。所以数组是这个结构化集合的线性化。这些属性数组元素都与不同的值进行比较,具体取决于对象在结构化集合中的位置。这些值的结构也与集合的结构相关:-)
属性数组可能属于不同类型。
所以我写了一个宏,它遍历所有属性(给定任何属性数组)并提供可用作比较值数组的数组索引的动态结构信息。这个宏有作为输入:
- 属性数组
- 比较谓词
- 比较值数组
- 以及值数组的索引变量名称(用于在宏内相当复杂的循环中提供结构信息)
- 收集结果的布尔值
所以你可以这样说:
COMP_ALL(attr1Arr, <=, limitbyCath1Arr, cath1Idx, anyLimitFault)
在对不同类别进行线性化的深度循环中的某处,您会发现类似的比较:
anyLimitFault = anyLimitFault
&& (attr1Arr[objCounter] <= limitbyCath1Arr[cath1Idx]);
现在有时只有一个极限值所以我想写:
int limit = -1;
COMP_ALL(attr4Arr, <=, (&limit), 0, anyLimitFault);
我当然可以:
int limit = -1;
int temp[1];
temp[0] = limit;
COMP_ALL(attr4Arr, <=, temp, 0, anyLimitFault);
但我更喜欢另一种方式,所以我可以概括为:
COMP_ALL2Value(attr_arr, pred, val, collector) \
COMP_ALL(attr_arr, pred, (&val), 0, collector)
是的。
表达式 &x[0]
简单地等同于 *(&x + 0)
与 *(&x)
相同,即 x
(对于任何变量 x
,我相信)。
是的。 &a
在您的示例中可以被视为指向单元素数组第一个元素的指针。
C99 / C11 §6.5.6 Additive operators section 7
For the purposes of these operators, a pointer to an object that is not an element of an
array behaves the same as a pointer to the first element of an array of length one with the
type of the object as its element type.
(请注意,问题已针对 "register" 个变量进行了扩展)
简而言之,我的问题是:这是合法的 C 代码吗(根据不同 ISO 9899 C 的标准的字母 - 理想情况下 "proof" 按照标准的话):
int a = 0;
int b = (&a)[0];
const int c = 0;
b = (&c)[0];
问题扩展:
/* Question extension */
register int d = 0;
int e = (&d)[0];
背景:
我有一组数组表示结构化对象集合的属性——每个属性一个数组。所以数组是这个结构化集合的线性化。这些属性数组元素都与不同的值进行比较,具体取决于对象在结构化集合中的位置。这些值的结构也与集合的结构相关:-) 属性数组可能属于不同类型。
所以我写了一个宏,它遍历所有属性(给定任何属性数组)并提供可用作比较值数组的数组索引的动态结构信息。这个宏有作为输入: - 属性数组 - 比较谓词 - 比较值数组 - 以及值数组的索引变量名称(用于在宏内相当复杂的循环中提供结构信息) - 收集结果的布尔值
所以你可以这样说:
COMP_ALL(attr1Arr, <=, limitbyCath1Arr, cath1Idx, anyLimitFault)
在对不同类别进行线性化的深度循环中的某处,您会发现类似的比较:
anyLimitFault = anyLimitFault
&& (attr1Arr[objCounter] <= limitbyCath1Arr[cath1Idx]);
现在有时只有一个极限值所以我想写:
int limit = -1;
COMP_ALL(attr4Arr, <=, (&limit), 0, anyLimitFault);
我当然可以:
int limit = -1;
int temp[1];
temp[0] = limit;
COMP_ALL(attr4Arr, <=, temp, 0, anyLimitFault);
但我更喜欢另一种方式,所以我可以概括为:
COMP_ALL2Value(attr_arr, pred, val, collector) \
COMP_ALL(attr_arr, pred, (&val), 0, collector)
是的。
表达式 &x[0]
简单地等同于 *(&x + 0)
与 *(&x)
相同,即 x
(对于任何变量 x
,我相信)。
是的。 &a
在您的示例中可以被视为指向单元素数组第一个元素的指针。
C99 / C11 §6.5.6 Additive operators section 7
For the purposes of these operators, a pointer to an object that is not an element of an array behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.