加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将指向单个值的指针用作Array

发布时间:2020-12-16 09:55:54 所属栏目:百科 来源:网络整理
导读:(注意,问题已扩展为“注册”变量) 我的问题简而言之:这是合法的C代码(对于不同的ISO 9899 C标准的标准字母 – 理想情况下是标准中的“证明”): int a = 0;int b = (a)[0];const int c = 0;b = (c)[0]; 问题扩展: This comment by Jens Gustedt表明不允许
(注意,问题已扩展为“注册”变量)

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

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

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

问题扩展:
This comment by 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),anyLimitFault);

我当然可以这样做:

int limit = -1;
 int temp[1];
 temp[0] = limit;

 COMP_ALL(attr4Arr,temp,anyLimitFault);

但我更喜欢另一种方式,所以我可以加入:

COMP_ALL2Value(attr_arr,pred,val,collector) 
      COMP_ALL(attr_arr,(&val),collector)

解决方法

是.您的示例中的& 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读