使用指向单值的指针作为数组

时间:2015-01-09 12:11:00

标签: c arrays pointers c99 c89

(注意问题已扩展为“注册”变量)

我的问题简而言之:这是合法的C代码(对于不同的ISO 9899 C标准的标准字母 - 理想情况下是标准中的“证明”):

int a = 0;
int b = (&a)[0];

const int c = 0;
b = (&c)[0];

问题扩展: This comment Jens Gustedt表示不允许接收寄存器变量的地址。这是真的?请问还可以从标准中提供额外的引用来解释这个问题吗?

/* Question extension */
register int d = 0;
int e = (&d)[0];

背景:

我有一组表示结构化对象集合的属性的数组 - 对于每个属性一个数组。因此,数组是此结构化集合的线性化。这些属性数组元素都与不同的值进行比较,具体取决于结构化集合中对象的位置。这些值的结构也与集合结构相关:-) 属性数组可以是不同类型的。

所以我写了一个宏,迭代所有的attributs(给定任何属性数组)并提供可以用作比较值数组的数组索引的动态结构信息。这个宏有输入: - 属性数组 - 比较谓词 - 比较值数组 - 以及值数组的索引变量名称(用于在宏内的非常复杂的循环中提供结构信息) - 用于收集结果的布尔值

所以你可以这样说:

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)

2 个答案:

答案 0 :(得分:4)

表达式&x[0]只相当于*(&x + 0),它与*(&x)相同,x(对于任何变量x,我相信)

答案 1 :(得分:3)

是。您的示例中的&a可以视为指向单元素数组的第一个元素的指针。

  

C99 /C11§6.5.6添加剂运算符第7节

     

出于这些运算符的目的,指向不是元素的对象的指针   数组的行为与指向长度为1的数组的第一个元素的指针相同   对象的类型作为其元素类型。