C - 何时使用指针算法,何时使用数组索引?

时间:2012-07-24 06:18:51

标签: c arrays pointers

在C中,何时优先使用另一个?

6 个答案:

答案 0 :(得分:14)

这实际上是风格和编码惯例的问题,因为在C p[i]定义*(p+i)相同,其中p是指针和i一个整数索引。 AFAIK你甚至可以写i[p]但这很难看。

在C ++中并不总是如此(这使您能够定义operator []等...)。

我个人不喜欢手工编码&p[i],在这种情况下更喜欢p+i

答案 1 :(得分:10)

通常取决于具体情况。我认为没有经验法则。

在某些情况下,数组索引更好。例如,当您分配了一个数组

char* ptr = malloc(SIZE);

并且您需要ptr的值不要更改,因为您想稍后释放它,然后您可以使用索引。

或者如果你得到一个指针作为函数参数

void func(char* ptr)

并且你需要遍历数组,然后你可以增加指针本身,你不需要创建一个新的变量来用作索引。

但在大多数情况下,这取决于您自己的偏好。

答案 2 :(得分:9)

“数组索引”只是包含“指针算术”的语法糖。它纯粹是装饰性的,只是另一种符号,意味着使用一种或另一种是个人偏好的问题。

通常隐藏在你所问的背后的真正问题是何时使用随机访问以及何时使用顺序访问(使用“指针算术”意味着指针的顺序递增/递减不超过1)。答案是:尽可能使用顺序访问,只在必要时才使用随机访问。

只要性能不受影响,依靠最小的需求集来实现算法总是更好的主意。随机访问比顺序访问更强烈,这意味着在合理可能的情况下应该避免使用前者。

答案 3 :(得分:2)

就性能而言,最好使用指针算法(至少禁用编译器优化),因为在迭代数组时,您不必增加单独的变量。另见K& R第97页(第二版)。

否则只是编码风格的问题。

答案 4 :(得分:0)

在编译时不知道数据结构的大小时,指针很有用。例如当你不知道字符串的长度,或者你期望的整数数等等时。在这种情况下,指针可以根据需要动态分配内存。

另一方面,阵列降低了灵活性。

但是,除了这种差异之外还有更多的东西。

答案 5 :(得分:-1)

根据MISRA C ++ 2008(规则5-0-15): 数组索引应该是指针算法的唯一形式。

但是这条规则有一个例外:

递增/递减运算符可用于通过指向数组的指针实现的迭代器

testArr