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

原文地址:https://www.cnblogs.com/xiejava/p/15171488.html