zoukankan      html  css  js  c++  java
  • C语言中指针变量作为函数参数和一般变量作为函数参数的区别

    函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。

    指针变量作为函数参数和一般变量作为函数参数是有区别的,对于这种区别初学者一般都很迷惑。下面我将就一个简单的例子来说明一下它们的区别。看透以后也许也就不那么疑惑了。

    # include <stdio.h>
    void main()
    {
     void swap1(int a,int b);
     void swap2(int *p1,int *p2);
     int *p1,*p2,*p,a,b;
     scanf("%d,%d",&a,&b);
     p1=&a;p2=&b;
     if(a<b)
     {
      p=p1;
      p1=p2;
      p2=p;
     }
     printf("a=%d,b=%d/n/n",a,b);
     printf("max=%d,min=%d/n",*p1,*p2);
     if(a<b)
     {
      int *addra=&a; //a的地址&a=0x0012ff70
      int *addrb=&b; //b的地址&b=0x0012ff6c
      swap1(a,b);
     }
        printf("swap1 a=%d,b=%d/n/n",a,b);
     if(a<b)
     {
      swap2(&a,&b);
     }
     printf("swap2 a=%d,b=%d/n/n",a,b);
    }
    void swap1(int a,int b)
    {
     int *addra=&a;  //a的地址&a=0x0012ff10
     int *addrb=&b;  //b的地址&b=0x0012ff14
     int temp;
     temp=a;
     a=b;
     b=temp;
    }
    void swap2(int *p1,int *p2)
    {
     int *addrP1=&(*p1); //*p1的地址和a的地址一样为0x0012ff70
     int *addrP2=&(*p2); //*p2的地址和b的地址一样为0x0012ff6c
     int temp;
     temp=*p1;
     *p1=*p2;
     *p2=temp;
    }

    这是一个简单的参数传递的例子,在VC++6.0中将各个参数的地址调试出来进行比较
    1、在swap1函数中参数是简单的整数类型。可以看到实参的内存地址和形参的内存地址不一样也就是说一般的函数参数传递是值传递,但是在函数调用过程中形参重新申请了新的内存空间。实参将值传给了形参。
    2、在swap2函数中参数是指针变量,可以看到参数传递是值传递,实参将地址传给了形参。实参和形参是同一地址,指向的是同一内存空间。

    所以指针变量可以实现“通过调用函数使变量的值发生变化,在主调函数(如main函数)中可以使用这些改变了的值”的目的。

     补充:
    不管是什么情况在函数调用时,将实参变量的值传给型参变量都是"值传递".
    如果为了使在函数中改变了的变量值能被main函数所用,不能采取把要改变值的变量作为参数的办法,而应用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来。
    不能企图通过改变形参的值而实指针实参的值改变。见以下程序
    # 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;
     if(a<b)
     {
      swap(pointer_1,pointer_2);
     }
     printf("/n%d,%d/n",*pointer_1,*pointer_2);
    }

    void swap(int * p1,int * p2)
    {
     int * p;
     p=p1;
     p1=p2;
     p2=p;
    }
    结果
    输入1,3
    结果1,3

  • 相关阅读:
    Flashback version/Transaction Query,FlashbackTable
    Flashback Query(函数示例)
    FlashbackQuery:SCN与timestamp示例
    Flashback Drop实例操作
    Flashback Recovery Area的设置与取消
    flashback database操作步骤
    Oracle-nomount/mount/open
    oracle开启/关闭归档模式
    Eclipse 设置代码风格
    Eclipse 打包Web项目
  • 原文地址:https://www.cnblogs.com/xiejava/p/15171488.html
Copyright © 2011-2022 走看看