C语言中指针传递问题

要求:通过调用函数实现两个值的交换

例如:输入5,9 —– 输出9,5


不能到达预期的结果的代码

#include<stdio.h>

void main()
{
    void swap(int *p1, int *p2);
    int a,b;
    int *pointer_1,*pointer_2;
    scanf("%d,%d",&a,&b);
    pointer_1 = &a;
    pointer_2 = &b;
    printf("指针pointer_1、pointer_2初始化的地址(自身)   %d     %d\n", &pointer_1, &pointer_2); //1703732  1703728
    printf("指针pointer_1、pointer_2存储的值   %d     %d\n", pointer_1, pointer_2); //1703740  1703736

    printf("\n");
    printf("a,b交换之前的地址   %d       %d\n", &a, &b);  //1703740  1703736
    printf("a,b交换之前的值   %d       %d\n", a, b);  //5  9

    if(a < b)
    {
        swap(pointer_1,pointer_2);
    }
    printf("指针pointer_1、pointer_2初始化的地址(自身)   %d     %d\n", &pointer_1, &pointer_2); //1703732  1703728
    printf("指针pointer_1、pointer_2存储的值   %d     %d\n", pointer_1, pointer_2); //1703740  1703736

    printf("\n");
    printf("a,b交换之后的地址   %d       %d\n", &a, &b);  //1703740  1703736
    printf("a,b交换之后的值   %d       %d\n", a, b);  //5  9

}

void swap(int *p1,int *p2)
{
    printf("\n******************调用函数开始****************");
    printf("\n");
    printf("before_self     %d      %d\n",&p1,&p2); //1703644  1703648
    printf("before_storage_address     %d      %d\n",p1,p2);  //1703740  1703736
    printf("before_result     %d      %d\n",*p1,*p2);  //5  9

    int *p;
    p = p1;
    p1 = p2;
    p2 = p;

    printf("\n");
    printf("after_self     %d      %d\n",&p1,&p2);  //1703644  1703648
    printf("before_storage_address     %d      %d\n",p1,p2);  //1703736  1703740
    printf("after_result     %d      %d\n",*p1,*p2);  //9  5

    printf("******************调用函数结束****************\n\n");
}

输出结果

这里写图片描述

原因

在给a和b分别赋值5,9后,把a的地址1703740给了指针变量pointer_1,把b1703736的地址给了指针变量pointer_2(为了方便,地址用%d输出,不同的PC,情况不同,但是原理都一样)。然后调用函数,把指针存储的值(a、b的地址)传递给P1、P2指针。

swap(pointer_1,pointer_2);
void swap(int *p1, int *p2);

在调用函数的进行交换的代码,可以看出,只是单纯的将各自存储的地址进行交换而已。

int *p;
p = p1;
p1 = p2;
p2 = p;

所以,指针变量只是在调用函数里交换了存储的地址,可以在调用函数里输出9,5。但是一旦调用结束,P1、P2指针变量就会被释放。并没有在根本上进行交换。

这里写图片描述


能到达预期的结果的代码

只需要将调用函数修改如下:

void swap(int *p1,int *p2)
{
    printf("\n******************调用函数开始****************");
    printf("\n");
    printf("before_self     %d      %d\n",&p1,&p2); //1703644  1703648
    printf("before_storage_address     %d      %d\n",p1,p2);  //1703740  1703736
    printf("before_result     %d      %d\n",*p1,*p2);  //5  9

    int p;
    p = *p1;
    *p1 = *p2;
    *p2 = p;

    printf("\n");
    printf("after_self     %d      %d\n",&p1,&p2);  //1703644  1703648
    printf("before_storage_address     %d      %d\n",p1,p2);  //1703740  1703736
    printf("after_result     %d      %d\n",*p1,*p2);  //9  5

    printf("******************调用函数结束****************\n\n");
}

输出结果

这里写图片描述

原因

修改后的调用函数的指针变量,交换的不再是地址,而是通过地址找到a、b的值,将a、b的值进行交换

int p;
p = *p1;
*p1 = *p2;
*p2 = p;

这里写图片描述

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值