这句话一直困扰我这很久。不过最近通过gdb终于明白了。
形参就是函数定义与函数说明时带的参数。而实参就是函数调用时给的参数。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。
不能通过修改形参的值来修改实参。这句话在普通的数值类型,很容易明白。但是加上了C语言中的指针,就糊涂了。要想明白指针,只要记住一句话就行:指针是保存变量地址的一种数值类型。与其他的类型相比,它保存的是地址而已,没有其他的区别了。
先看代码:
#include<stdio.h> 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指向的地址。