我是c的新手。当使用指针时,是否认为使用负索引是一种不好的做法?
考虑以下代码:
#include <stdio.h>
void loopDown(int *intPointer, int maxStep);
int main() {
int myArray [10]={0};
myArray[0] = 5;
int myMaxStep = 5;
int *myPointer = myArray + myMaxStep;
// loopDown(&*myPointer,myMaxStep); //Bad practice suggested by Jonathan
loopDown(myPointer,myMaxStep); //Edited version
return 0;
}
void loopDown(int *intPointer, int maxStep){
int i;
int j;
for(i=0;i<=maxStep;i++){
// printf("%d",i);
j = -1*i;
printf("%dn",intPointer[j]);
}
};
和输出:
0
0
0
0
0
5
不像python(我使用的另一种语言),c没有快速切片数组的方法。我认为指针对我来说是一个非常方便的解决方案来"切割"没有实际切割它的数组。这会被认为是难以阅读/不好的做法还是有更好的情况?
如果在代码的其他部分有其他不好的做法,请随意指出来。我还在学习。谢谢:)
电脑不在乎。编译器并不关心。C标准定义了指针负偏移量的语义。正确使用它们的程序将按预期工作。
所以唯一要考虑的是人类。人类是麻烦。他们误解事物,他们犯错误。他们养成习惯,他们做出假设。其中一些可能假设"数组下标"是非负的,尽管C标准中没有这样规定。
使用负指针是可以的,但是要确保容易出错的人知道你在做什么。有时,负指数自然出现。有一些信号滤波器计算下一个新的输出作为一些输入和一些以前的输出的函数。在这种情况下,当OutputPointer
指向下一个输出应该存储的位置时,前面的输出自然是OutputPointer[-1]
, OutputPointer[-2]
,等等。
所有的源代码都应该有良好的文档记录,不管它是否使用负偏移量。让读者明白软件在做什么以及为什么。