今天我写函数在处理参数的时候变量和指针完全混乱了,各种结构体参数以指针以变量的形式各种传,然后彻底凌乱了。最后改到都没有办法编译了,然后就到处找关于参数传递的地址传递,然后发现一个很简单的交换a,b用地址交换我都不会,我的原程序是
#include<iostream>
using namespace std;
void hanshu(int *a,int *b)
{
int *t;
t=a;
a=b;
b=t;
}
int main()
{
int a=7,b=4;
hanshu(&a,&b);
cout<<a<<" "<<b<<endl;
}
我原本以为传递地址之后,交换两个地址就可以使得a,b的值交换,后来发现根本达不到想要的结果。然后百度了一下,发现其实是个很蠢的错误,其实函数a,b两个指针也是形参地址,就算交换了也没有在实参上产生任何作用。然后才有了下面改进后的代码,但是也只是做到了交换指针内的地址。
#include<iostream>
using namespace std;void hanshu(int **a,int **b) //交换指针指向的地址,int型的指向指针的指针,新的a,b指针
{
cout<<a<<" "<<*a<<" "<<b<<" "<<*b<<endl;//a,b指针中存放变量a,b的值,*a,*b为指针p,q的地址;
cout<<a<<" "<<*a<<" "<<**a<<" "<<&a<<" "<<&*a<<" "<<&**a<<endl;
int *t; //通过交换a,b指向的指向a,b的指针内的地址,改变原指针指向的值,原a,b内的值没有改变
t=*a;
*a=*b;
*b=t;
cout<<a<<" "<<*a<<" "<<b<<" "<<*b<<endl;
}
int main ()
{
int a=7,b=4;
cout<<&a<<" "<<&b<<endl;
int *p=&a,*q=&b;
cout<<p<<" "<<&p<<" "<<*p<<" "<<q<<" "<<&q<<" "<<*q<<endl;
hanshu(&p,&q);
cout<<*p<<" "<<*q<<endl;
cout<<a<<" "<<b<<endl;
//;cout<<*p<<" "<<*q<<endl;
return 0;
}
我调试的时候有过一段这样的代码
int *t;
t=&a;
&a=&b;
&b=t;
就是想直接改地址,后来编译的时候提示must have l-value,就是是说赋值的时候等号左边必须要有左值,左边的值必须有内存空间或者是是一个可更改的变量,还不能是不可以更改的指针地址。好像很高端呀,其实只是&a根本就只是一个地址相当于一个常量,怎么可以做赋值运算,就像不能写3=4一样,我这是脑抽抽了。