在C编程语言中,如何在函数中切换指针?

5

如何在函数中切换指针?

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;
}

5
在C语言中,“一切皆值传递”。如果你想让一个函数改变某些东西,你需要将指向它的指针传递给函数。所以,如果你想让一个函数改变指针,你需要传递一个指向指针的指针。也就是说,传递一个指向指针的指针。一旦你开始这样思考,所有的事情都变得容易了(至少函数调用是如此!) - Alok Singhal
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*/

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;
}

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)

2

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

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

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


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是指针的情况下,那么你就需要传递一个双重指针。希望这可以帮到你。


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;
}

1
请参考这里,了解另一个类似的问题的解释。一旦您阅读了这个,就会更容易理解上面的其他答案。
希望这有所帮助, 最好的问候, 汤姆。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接