在 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++
。
我正在学习 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++
。