7

如何在函数中切换指针?

void ChangePointers(int *p_intP1, int *p_intP2); 

int main() {

int i = 100,  j = 500;
int *intP1, *intP2; /* pointers */
intP1 = &i;
intP2 = &j;
printf("%d\n", *intP1); /* prints 100 (i) */
printf("%d\n", *intP2); /* prints 500 (j) */
ChangePointers(intP1, intP2);


printf("%d\n", *intP1); /* still prints  100, would like it swapped by now */
printf("%d\n", *intP2); /* still prints  500 would like it swapped by now */
}/* end main */

void ChangePointers(int *p_intP1, int *p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = p_intP2;
p_intP2 = p_intP1;
p_intP1= l_intP3;
}
4

7 回答 7

14

在 C 中,参数总是按值传递。尽管您正在更改被调用函数内的指针变量的值,但更改不会反映回调用函数。尝试这样做:

void ChangePointers(int **p_intP1, int **p_intP2); /*Prototype*/

void ChangePointers(int **p_intP1, int **p_intP2) /*Definition*/
{
    int *l_intP3; /* local for swap */
    l_intP3 = *p_intP2;
    *p_intP2 = *p_intP1;
    *p_intP1= l_intP3;
}

来自 main() 的相应调用应该是:

ChangePointers(&intP1, &intP2);/*Passing in the address of the pointers instead of their values*/
于 2009-12-28T16:59:39.460 回答
13

你需要一个指向指针的指针。

ChangePointers(&intP1, &intP2);

void ChangePointers(int **p_intP1, int **p_intP2) {
        int *l_intP3;
        l_intP3 = *p_intP2;
        *p_intP2 = *p_intP1;
        *p_intP1 = l_intP3;
}
于 2009-12-28T16:58:32.787 回答
5

更改签名以将指针指向指针。

void ChangePointers(int **p_intP1, int **p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1= l_intP3;
}

或者,如果您希望调用代码看起来相同,类似于 C++ 引用,请使用宏。

void ChangePointersImpl(int **p_intP1, int **p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1= l_intP3;
}

#define ChangePointers(a,b) ChangePointersImpl(&a, &b)
于 2009-12-28T16:57:21.240 回答
2

您正在函数内部更改指针的本地值 - 一旦退出,这些更改就不会持续存在。如果要更改指针指向的值,则需要:

int intP3; /* local for swap */
intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1 = intP3;

如果您想更改指针本身的值(例如地址),您需要将指针传递给这些指针,而不是指针本身。

于 2009-12-28T16:58:12.957 回答
2

除了所有这些答案之外,我只想补充一点,当我在这种情况下无法理解指针时,我会将其归结为更简单的东西,比如 int。假设您将 int 传递给函数:

int x = 10;
change_int(x);
printf("%d",x);
void change_int(int y)
{
   y = 20;
}

x 显然仍会打印 10。要实际更改 x,您必须将指针传递给 x,以便您可以直接修改 x。

int x = 10;
change_int(&x);
printf("%d",x);
void change_int(int *y)
{
   *y = 20;
}

现在 x 将打印 20。现在只需应用相同的推理,就好像 x 是一个指针,那么你必须传递一个双指针。希望这可以帮助。

于 2009-12-28T17:36:57.497 回答
1

如果要切换指针,则必须传入指针的地址而不是指针值:

void ChangePointers(int **p_intP1, int **p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1= l_intP3;
}
于 2009-12-28T16:58:58.650 回答
1

请参阅此处了解另一个类似的问题。阅读完本文后,这将使您更容易理解上述其他答案。

希望这会有所帮助,最好的问候,汤姆。

于 2009-12-28T17:43:46.200 回答