关于指针作函数参数

来源:互联网 发布:bose蓝牙音响 知乎 编辑:程序博客网 时间:2024/04/30 10:21
源代码:
#include<iostream>using namespace std;int main(){void swap(int *p1,int *p2);int *pointer_1,*pointer_2,a,b;cin>>a>>b;pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);cout<<"max"<<a<<"min"<<b<<endl;return 0; }   void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; }</span>
  注意:a. cout<<a;对于这个语句而言,输出a时,系统要检测出变量a变量的首地址,然后根据变量a的数据类型检测出数据a的末地址,提取两地址间的所有数据,然后根据a所对应的数据类型输出数据,当通过指针改变了a所指向的地址时,那么a所对应的数据就被改变了。
              b.其实可以这样理解,变量名其实是一个地址名,变量名与其所对应的那个数据的关系就像是指针与里面数据的关系,例如赋值语句a=b;其实是对a所对应的那个地址里面的储存空间重新赋上数据。
              c.用指针改变变量的其实就是改变了该地址里面的数据。像在这个源代码里面,*p1和a,都是指向的同一个地址,利用swap对地址里面的数据进行了重新的赋值(应该可以这样理解),所以a,p1的值都被改变了(它们指的是同一个地址)
              d.那么问题来了,既然变量名与指针都指的是地址,那他们有什么区别?在函数的应用中,为什么用指针的形式可以改变变量所对应的值,而用变量名的形式却不可以?
              解答:虽然他们都是对地址里面的内存进行操作,但是操作的对象(及相应的地址是不同的)例如下面源代码:
#include<iostream>using namespace std;int main(){void change(int *x,int *y); void change2(int j,int k);int a=1,b=2,c=3,d=4;int *p1,*p2;p1=&a;p2=&b;change(p1,p2);cout<<a<<' '<<b<<endl;cout<<c<<' '<<d<<endl;return 0; }void change(int *x,int *y){int temp;temp=*x;*x=*y;*y=temp;}void change2(int j,int k){int temp;temp=j;j=k;k=temp;}

     在上述的源代码中,change(int  *x,int *y)函数是引用指针操作,操作的地址是a,b的地址,所以改变了a,b的值,而在change2(int j,int k);中,j,k只是接受了c,d的值,但是此时作为形参的j,k另外开辟了储存空间,所以操作的储存空间实际上与c,d的储存空间是不一致的,所以改变不了c,d的值。
              e.在编译的时候编译器会把程序中出现的所有变量名都换成相对内存地址,变量名不占内存;
              f.书上有句话叫做:由于虚实结合是采取单向的值传递方式,只能从实参向形参传递数据,形参的值的改变无法回传给实参,其原因是形参会另外地开辟存储空间,并且函数执行结束后就会释放,所以不能够改变实参的数值;
              g.swap(int *p1,int *p2),中,*p1是与上述指(pointer_1)针是同一个类型,当时自己还纠结了好久,以为实参与形参的类型名不一样;
              h.对于一个指针变量,必须先对其进行赋地址操作,然后才能进行赋值操作;例如在该源代码中,若将函数改为:
void swap(int *p1,int *p2) { int *temp; *temp=*p1; *p1=*p2; *p2=*temp; }
  编译是可以通过的,但是在运行的时候是会出错误的,程序会不顾的停止运行。这是因为temp的地址未知,*temp的值无法确定,temp所指向的单元无法确定,这种情况编译器是不能够正常工作的。
            i.不能试图通过改变形参指针变量的值而使实参指针变量的只改变,例如:
void swap(int *p1,int *p2) { int *temp; temp=p1; p1=p2; p2=temp; }
  上述变量也只是对于形参地址的改变,并没有对想要改变的值的地址进行操作,所以不能够将值进行交换。
           j.调用函数时不会改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值。(操作地址中储存的数据)
0 0
原创粉丝点击