利用指针对两个变量的值进行调换

本文讲述了在C语言程序中,如何正确地使用指针进行变量值的交换,以及常见的错误示例,包括传递变量值而非指针、未初始化临时变量导致的野指针问题。
摘要由CSDN通过智能技术生成

以下是该程序的正确代码

#define _CRT_SECURE_NO_WARNINS
#include<stdio.h>
int Swap(int* a, int* b)//定义一个函数,形参为两个变量的指针
{
    int temp;//定义一个整形的中间变量。
    temp = *a;//将指针a解引用,并将a的值赋给temp。
    *a = *b;//将指针b解引用,赋值给a。
    *b = temp;//将temp中a的值赋给b,完成a和b值的调换。
    return 0;
}
int main()
{
    int n = 100, m = 20;//定义两个变量并赋值。
    Swap(&n, &m);//调用函数,并传入两个变量的指针
    printf("%d,%d", n, m);//输出调换后两个变量的值。
}

在写该程序是,经常出现以下一些错误

一.

void Swap ( int a , int b )
{
        int tmp = a ;
        a = b ;
        b = tmp ;
}
int main ()
{
        int a = 10 ;
        int b = 20 ;
        printf ( " 交换前 :a=%d,b=%d\n" , a , b );
        Swap ( a , b );
        printf ( " 交换后 :a=%d,b=%d\n" , a , b );
        return 0 ;
}
     这个代码调用Swap函数时输入的是 变量的值 而不是 指针 ,而在 函数Swap中 的a和b与 主函数中 的a和b的地址并不一样,所以Swap中所交换的a,b的值对主函数中的a,b的值没有影响。最后Swap中的a与b的值进行了调换,但主函数中的a和b的值保持不变。
 
二.
void Swap ( int* p1 , int* p2 )
{
        int* tmp = p1 ;
        p1 = p2 ;
        p2 = tmp ;
}
int main ()
{
        int a = 10 ;
        int b = 20 ;
        printf ( " 交换前 :a=%d,b=%d\n" , a , b );
        Swap ( & a , & b );
        printf ( " 交换后 :a=%d,b=%d\n" , a , b );
        return 0 ;
}
       相比于上一个错误,这串代码在调用Swap函数时传入的是a和b的指针。除此之外,在Swap函数中进行了a和b的指针交换,最终结果依然没有调换成功。原因是只是调换了a和b的指针地址,a和b的值依然没有发生交换,所以应该对穿来的指针进行解引用之后在进行交换。
三.
void Swap ( int* p1 , int* p2 ) // 编译错误 , 老的编译器程序崩溃
{
        int* tmp ; //tmp 的值是随机值或者 -858993460(0xcccccccc)
        * tmp = * p1 ; // 错误
        * p1 = * p2 ;
        * p2 = * tmp ;
}
        int main ()
{
        int a = 10 ;
        int b = 20 ;
        printf ( " 交换前 :a=%d,b=%d\n" , a , b ); Swap ( & a , & b );
        printf ( " 交换后 :a=%d,b=%d\n" , a , b );
        return 0 ;
}
        这串代码在调用Swap时传入的是指针,在Swap中也是先对指针解引用后对a和b的值进行交换,但对这串代码进行编译时显示错误。原因是temp并没有得到初始化,所以不能直接使用temp的指针也不能解引用,这种也叫做野指针。
  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值