C语言中指针的最佳实践

Best Practice for pointers in C-language

我是 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("%d\n",intPointer[j]);
  }
};

它的输出:

0
0
0
0
0
5

与python(我使用的另一种语言)不同,c 没有快速分割数组的方法。 而且我认为指针对我来说是一种非常方便的解决方案,可以在不实际切割数组的情况下“切割”它。这会被认为很难 read/bad 练习还是有更好的情况?

如果代码的其他部分有其他不好的做法,请随时指出。我还在学习。谢谢:)

计算机不关心。编译器不关心。 C 标准定义了指针的负偏移量的语义。正确使用它们的程序将按预期工作。

所以唯一要考虑的是人。人类是麻烦。他们误解了事情,他们犯了错误。他们养成习惯,他们做出假设。他们中的一些人可能会假设“数组索引”是非负的,即使 C 标准中没有这样说。

使用负指针没问题,但要确保 error-prone 人们知道你在做什么。有时负指数自然出现。有信号过滤器计算下一个新输出作为一些输入和一些先前输出的函数。这样的话,当OutputPointer指向下一个输出应该存放的地方时,前面的输出自然是OutputPointer[-1]OutputPointer[-2]等。

所有源代码都应该有完整的文档记录,无论它是否使用负偏移量。让 reader 清楚软件在做什么以及为什么。