【问题标题】:Confused with C pointers与 C 指针混淆
【发布时间】:2018-12-26 22:27:38
【问题描述】:
 #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 functon 没有改变值吗?

【问题讨论】:

    标签: c function pointers swap


    【解决方案1】:

    这是swapDoesNotWork进行的所有修改:

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

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

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

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

    这些是分配给pxpy 分别指向的位置。尽管pxpy 本身是局部变量,但它们可以指向当前函数之外的变量(在这种情况下,函数被称为swap(&amp;x, &amp;y),因此它们指向xy 变量在main)。

    【讨论】:

      【解决方案2】:

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

      你做的和这个基本一样:

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

      这意味着您正在对原始变量的副本进行操作。因此,尽管它正在更改指针的值(如果您在函数内尝试 printf,结果应该是正确的),但您所做的却是在函数完成后结果消失。为了使该函数起作用,您必须将双指针作为参数传递。希望我有所帮助

      【讨论】:

        猜你喜欢
        • 2014-11-18
        • 2010-09-25
        • 2011-09-04
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        相关资源
        最近更新 更多