这句话一直困扰我这很久。不过最近通过gdb终于明白了。
形参就是函数定义与函数说明时带的参数。而实参就是函数调用时给的参数。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。
不能通过修改形参的值来修改实参。这句话在普通的数值类型,很容易明白。但是加上了C语言中的指针,就糊涂了。要想明白指针,只要记住一句话就行:指针是保存变量地址的一种数值类型。与其他的类型相比,它保存的是地址而已,没有其他的区别了。
先看代码:
#include
void swap (int *,int *);
int main()
{
int a,b;
printf("Input a,b(a,b):");
scanf("%d,%d",&a,&b);
printf("The address a,b is %x,%x\n",&a,&b);
printf("a,b:%d,%d\n",a,b);
swap(&a,&b);
printf("a,b:%d,%d\n",a,b);
return 0;
}
void swap(int *p1,int *p2)
{
int *swap;
printf("in function swap\n");
printf("the value p1 and p2= %x ,%x\n",p1,p2);
printf("the address p1 and p2= %x ,%x\n",&p1,&p2);
printf("the *p1 and *p2= %d ,%d\n",*p1,*p2);
swap=p1;
p1=p2;
p2=swap;
printf("after swap\n");
printf("the value p1 and p2= %x ,%x\n",p1,p2);
printf("the address p1 and p2= %x ,%x\n",&p1,&p2);
printf("the *p1 and *p2= %d ,%d\n",*p1,*p2);
}
运行结果:
Input a,b(a,b):22,222
The address a,b is bfecdb04,bfecdb00
a,b:22,222
in function swap
the value p1 and p2= bfecdb04 ,bfecdb00
the address p1 and p2= bfecdae0 ,bfecdae4
the *p1 and *p2= 22 ,222
after swap
the value p1 and p2= bfecdb00 ,bfecdb04
the address p1 and p2= bfecdae0 ,bfecdae4
the *p1 and *p2= 222 ,22
a,b:22,222
a b 的内存地址分别为:0Xbfecdb04,0Xbfecdb00
通过swap函数,a b 的地址传递给 p1,p2。也就是指针p1,p2的值为a,b的内存地址。
接下来是三句赋值语句。改变的只是形参p1,p2的值。p1,p2的值分别为b,a的内存地址。变量a,b的值没有改变。改变的只是p1,p2指向的地址。