资源描述:
《指针作为函数形参》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、普通函数参数下面程序试图改变main函数中a和b的值#includevoidfun(intx,inty){intc;c=a;a=b;b=c;}intmain(){inta=1,b=2;fun(a,b);printf("a=%db=%d",a,b);return0;}函数参数传递分析:实参:&a28ff18a1&b28ff14b2在将实参传递给形参的时候,编译器将实参拷贝一份给形参。拷贝份的特点为:1)值与实参相同2)地址与实参不同拷贝份(形参)&x28ff04x1&y28ff00y2则在函数内部更改拷贝份的时候,只是
2、对函数内部的局部变量改变,而局部变量是存储在栈空间里的,当fun函数执行结束后,这两个变量会自动销毁,不会改变实参的数值。一级指针作为函数参数下面程序试图改变main函数中a和b的值#includevoidfun(int*a,int*b){intc;c=*a;*a=*b;*b=c;}20currencydeposit,weprescribeapassonaregularbasis,qilucardaccountonaregularbasis),certificatebondsandsavingsbonds(electro
3、nic);3.notdrawnonabanksavingscertificate,certificatebondsapplyformortgageloans,acceptingonlythelenderintmain(){int*a,*b;intx=1,y=2;a=&x;b=&y;fun(a,b);printf("a=%db=%d",x,y);return0;}函数参数传递分析main中变量的存储情况如下变量地址变量值&x:28ff18x:1&y:28ff14y:2指针变量地址指针变量内容指针表示地址里的内容&a:28ff28a:&x
4、*a:x&b:28ff24b:&y*b:y可见在main函数中,指针a和b的地址为28ff28,28ff24。而指针a和b存储的内容为x和y的地址28ff18、28ff14。*a,*b则是代表x和y变量的值。当调用fun函数时。main中的指针a和b则要拷贝一份给fun函数的形参。则形参的存储情况如下:形参指针变量地址形参指针变量内容形参指针变量存储的地址表示的内容&a:28f740a:28ff18*a:x&b:28f736b:28ff14*b:y可见:把实参指针变量传递给形参后。实参指针和形参指针的地址是不相同的。但是存储的内容确实相同
5、的。均是指向main函数中的x,y变量,当再fun函数中执行c=*a;*a=*b;*b=c;交换语句时。*a和*b为main函数中的x、y变量。这时候将会交换这两个变量的值。二级指针作为函数参数如果想在函数中改变父函数中的指针变量呢。#includevoidfun(int**c){int*b;b=(int*)malloc(sizeof(int));*b=2;*c=b;20currencydeposit,weprescribeapassonaregularbasis,qilucardaccountonaregularbas
6、is),certificatebondsandsavingsbonds(electronic);3.notdrawnonabanksavingscertificate,certificatebondsapplyformortgageloans,acceptingonlythelender}intmain(){int*a,x=1;a=&x;printf("%x",a);fun(&a);printf("%x",a);return0;}函数的实参存储如下:指针变量地址指针变量值指针变量值表示的内容&a:28f73ba:28f740*a:
7、x1变量地址变量值&x:28f740x:1函数的形参存储如下&cc:(&a)*c:(a)**c:(*a=x)28ff1c28f73b28f7401局部变量b的存储如下&bb(堆空间地址)*b28ffeec3917982函数运行完后,指针变量a的指向则为在fun函数中申请的堆空间的地址,存储如下指针变量地址指针变量值指针变量值表示的内容&a:28f73ba:381798*a:2将一级指针的地址赋值给形参的话,将会将一级指针的地址,变量值都赋值给二级指针的形参。此时在函数内部,二级指针(c)则能后获得外部一级指针变量(a)的地址、变量值、和普
8、通变量(i)的值。只要知道实参变量的地址,则在函数内部就可以改变实参变量的值。所以这里的二级指针就可以改变一级指针所指向的内容(一级指针变量的值),一级指针所指向地址的内容。函数运行完后,一级