4

今天我浏览了一些源代码(这是一个解释软件框架使用的示例文件),发现了很多这样的代码:

int* array = new int[10]; // or malloc, who cares. Please, no language wars. This is applicable to both languages
for ( int* ptr = &(array[0]); ptr <= &(array[9]); ptr++ )
{
   ...
}

所以基本上,他们已经完成了“获取位于地址的对象的地址array + x”。

通常我会说,这完全是愚蠢的,因为写作array + 0array + 9直接做同样的事情。我什至总是将这样的代码重写为 size_t for 循环,但这是风格问题。

但是过度使用它让我开始思考:我是否遗漏了一些明显的东西或隐藏在语言黑暗角落的东西?

对于任何想要查看原始源代码的人,所有它都是令人讨厌goto的 s ,malloc当然还有这个指针的东西,请随时在线查看

4

5 回答 5

5

是的,第一个没有充分的理由。这是完全相同的事情:

int *ptr = array;

我也同意第二个,不妨写:

ptr < (array + 10)

当然,您也可以将其for设为 0-9 的循环并将临时指针设置为指向数组的开头。

for(int i = 0, *ptr = array; i < 10; ++i, ++ptr)
    /* ... */

当然,这假设ptr在循环体内没有被修改。

于 2013-01-08T00:08:04.920 回答
2

你没有错过任何东西,它们的意思是一样的。

但是,为了更清楚地说明这一点,我应该说我也时常写出这样的表达方式,以增加清晰度。

我个人倾向于从面向对象编程的角度来思考,这意味着我更喜欢引用“n数组第 th 元素的地址”,而不是“n数组起始地址的第 th 偏移量”。尽管这两件事在 C 语言中是等价的,但当我编写代码时,我会想到前者——所以我表达了这一点。

也许这也是写这篇文章的人的理由。

于 2013-01-08T00:29:23.267 回答
1

根据经典数学:

Array[n]

指数组中的第 n 个元素。

要“获取”第n 个元素的地址,应用&oraddress of运算符:

  &Array[n]  

为了消除任何假定的歧义,添加了括号:

  &(Array[n])  

对于从左到右阅读的读者来说,这个表达式的含义是:
返回位置'n'处元素的地址

该保险可能已经发展为针对旧的错误编译器的保护。

有些人认为它比以下更具可读性:

  Array + n  

对不起,但我是老派,更喜欢使用'&'版本,无论是否有括号。我会浪费时间让代码更易于阅读,而不是担心哪个版本需要更长的编译时间或哪个版本更有效。

与为效率进行微优化或使用非语言律师不熟悉的语言部分的代码部分相比,明确注释的代码部分具有更高的投资回报率。

于 2013-01-08T01:36:37.297 回答
1

编辑:这部分不正确。阅读评论。


问题&(array[0])在于它扩展到&(*(array + 0))涉及取消引用。现在,每个编译器显然会将其优化为array + 0array + 0.

于 2013-01-08T00:10:00.407 回答
1

我认为他们这样写的原因是

&(array[0])

&(array[9])

只是看起来相似。另一种方法是写它

array + 0

array + 9

分别。正如您已经提到的,它们本质上是相同的(我希望至少大多数编译器都将其视为相同)。

您可以不同地解释这两种不同类型的表达式:第一个可以读作“元素 0 / 9 的地址”。第二个可以读作“元素偏移量为 0 / 9 的数组指针”。第一个听起来更高级,第二个听起来更低级。但是,大多数人倾向于使用第二种形式。

现在既然array + 0当然是一样的array,你就可以写了array。我认为这里的重点是循环的开始和结束看起来彼此“相似”。个人口味问题。

于 2013-01-08T00:10:09.717 回答