与C指针混淆

时间:2018-12-26 22:27:39

标签: c function pointers swap

 #include<stdio.h>

// Function to swap two values but does not work
void swapDoesNotWork (int *ptrX, int *ptrY);

// Function to swap two values and works fine
void swap (int *ptrX, int *ptrY);

void swap (int *px, int *py) {
 int temp;
 temp = *px;
 *px = *py;
 *py = temp;
}

void swapDoesNotWork (int *px, int *py) {
 printf("\n\n");
 int temp;
 temp = *px;
 px = py; 
 py = &temp;
}

int main() {
 int x = 5;
 int y = 10; 
 swapDoesNotWork(&x, &y);
 printf("++++++++++++++++++\n");
 printf("pre x:%d\n", x); 
 printf("pre y:%d\n", y); 
 printf("\n");
 printf("After calling swapDoesNotWork(&x, &y)...\n");
 printf("post x:%d\n", x); 
 printf("post y:%d\n", y); 
 printf("++++++++++++++++++\n\n");
 x = 5;
 y = 10; 
 printf("= = = = = = = = =\n\n");
 printf("pre x:%d\n", x); 
 printf("pre y:%d\n", y); 
 swap(&x, &y);

 printf("\n");
 printf("After calling swap(&x, &y)...\n");
 printf("post x:%d\n", x); 
 printf("post y:%d\n", y); 
 printf("= = = = = = = = =\n\n");
 return 0;

以上程序在编译和执行时的输出为:

infi@linux% ./swap_test.o 


++++++++++++++++++
pre x:5
pre y:10

After calling swapDoesNotWork(&x, &y)...
post x:5
post y:10
++++++++++++++++++

= = = = = = = = =
= = = = = = = = =    
pre x:5
pre y:10

After calling swap(&x, &y)...
post x:10
post y:5

可以看出,swapDoesNotWork函数似乎并没有像swap函数那样改变值。

我是C语言的新手,主要来自脚本背景。有人可以帮我为什么swapDoesNotWork函数不更改值吗?

2 个答案:

答案 0 :(得分:3)

这是swapDoesNotWork执行的所有修改:

 temp = ...
 px = ... 
 py = ...

所有这些都是对局部变量的赋值。函数返回时,局部变量将被销毁,因此swapDoesNotWork没有持久作用。它只会更改仍将停止存在的变量。

另一方面,swap包含以下几行:

 *px = ...
 *py = ...

这些分别是对pxpy所指向的位置的分配。即使pxpy本身就是局部变量,它们也可以指向当前函数之外的变量(在这种情况下,该函数称为swap(&x, &y),因此它们指向{{ x中的1}}和y变量。

答案 1 :(得分:1)

您所做的只是取消了使用指针的全部要点。

您所做的基本上与此相同:

temp = a;
a = b;
b = temp;

这意味着您正在处理原始变量的副本。因此,尽管完成了更改指针的值的操作(如果您在函数内部尝试使用printf,则结果应该是正确的),但是在函数完成后结果将消失。为了使该功能正常工作,您必须将双指针作为参数传递。希望我能帮忙