在 C 中有很多递增指针的方法,这里有什么区别?

Are there many ways of incrementing a pointer in C and what's the difference here?

我正在学习 C 并试图弄清楚如何在我有这个实例化时增加指针:int A[] = {111, 222, 333}; int *q = A; 然后我试图从零开始增加指针 q- A 的索引到下一个。

我写了两个函数:

void incr_ptr_single ( int *p ) {
    *&p = *&p + 1;
}

void incr_ptr_double ( int **h ) {
    *h = *h + 1;
}

我明白说 void incr_ptr( int *p) { p = p+1; } inc_ptr(q); 并不能满足我的要求,因为 C 的函数是 "pass by value".

现在 incr_ptr_double(&q) == A[1]incr_ptr_single(q) == A[0]。我想知道如何修复 incr_ptr_single 函数,使其表现得像 incr_ptr_double

"fix" incr_ptr_single 的一种方法是将它 return 递增的指针作为函数结果:

int * incr_ptr_single ( int *p ) {
    return p + 1;
}

您可以将其命名为:

q = incr_ptr_single(q);
q++;

或者,如果您希望混淆您的代码,使其变得更慢且可读性更差:

int* incr_ptr (const int* p) {
  return (int*)++p;
}

或者

void incr_ptr (int** p) 
{
  (*p)++;
}

还有许多其他方法可以让您的代码变得更糟,例如类似函数的宏。

或者如果出于某种原因糟糕的编程习惯不是您的菜,那就选择 q++