1:按值傳遞:
程序如下:
view plaincopy to clipboardprint?
#include <iostream>
using namespace std;
void swap(int a,int b)//指針保存地址
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"後: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
int a=3,b=4;
cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;
swap(a,b);//取地址傳遞 變量的內存地址
cout<<"主程序後:a:"<<a<<" b:"<<b<<endl;
return 0;
}
#include <iostream>
using namespace std;
void swap(int a,int b)//指針保存地址
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"後: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
inta=3,b=4;
cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;
swap(a,b);//取地址傳遞變量的內存地址
cout<<"主程序後: a:"<<a<<" b:"<<b<<endl;
return0;
}
輸出的結果是:
主程序前: a:3 b:4
前: a:3 b:4
後: a:4 b:3
主程序前: a:3 b:4
主程序的值沒有改變,改變的值是棧中的a 和b的副本的值,值傳遞的時候在棧中拷貝一個變量的副本來操作,這樣的話就改變不了以前的值.用的時候要小心.
2:按址傳遞:
這個時候是用地址傳遞 程序如下:
viewplaincopy to clipboardprint?
#include <iostream>
using namespace std;
void swap(int *a,int *b)//指針保存地址
{
int c;
cout<<"前: a:"<<*a<<" b:"<<*b<<endl;
c=*a;
*a=*b;
*b=c;
cout<<"後: a:"<<*a<<" b:"<<*b<<endl;
}
int main()
{
int a=3,b=4;
cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;
swap(&a,&b);//取地址傳遞 變量的內存地址
cout<<"主程序後:a:"<<a<<" b:"<<b<<endl;
return 0;
}
#include <iostream>
using namespace std;
void swap(int *a,int *b)//指針保存地址
{
int c;
cout<<"前: a:"<<*a<<" b:"<<*b<<endl;
c=*a;
*a=*b;
*b=c;
cout<<"後: a:"<<*a<<" b:"<<*b<<endl;
}
int main()
{
inta=3,b=4;
cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;
swap(&a,&b);//取地址傳遞變量的內存地址
cout<<"主程序後: a:"<<a<<" b:"<<b<<endl;
return0;
}
這個就是按地址傳遞 在方法swap(&a,&b);的參數中&a,&b都是取地址 那麼傳遞過去的地址由指針來接收所以在定義函數的時候有void swap(int *a,int *b)定義了倆個指針來存放地址,這樣就好理解了 swap(){}函數裏面的操作都是按指針來操作的*a ,*b
這樣的話結果就是:
主程序前: a:3 b:4
前: a:3 b:4
後: a:4 b:3
主程序前: a:4 b:3
可以看到結果是改變了,因爲直接操作的是a,b的內存地址
3:按別名(引用)傳遞:
viewplaincopy to clipboardprint?
#include <iostream>
using namespace std;
void swap(int &a,int&b)//接收倆個別名
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"後: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
int a=3,b=4;
cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;
swap(a,b);//直接傳遞a b 傳遞過去的時候由別名接收那麼就是自身的別名了
cout<<"主程序後:a:"<<a<<" b:"<<b<<endl;
return 0;
}
#include <iostream>
using namespace std;
void swap(int &a,int &b)//接收倆個別名
{
int c;
cout<<"前: a:"<<a<<" b:"<<b<<endl;
c=a;
a=b;
b=c;
cout<<"後: a:"<<a<<" b:"<<b<<endl;
}
int main()
{
inta=3,b=4;
cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;
swap(a,b);//直接傳遞a b 傳遞過去的時候由別名接收 那麼就是自身的別名了
cout<<"主程序後: a:"<<a<<" b:"<<b<<endl;
return0;
}
這樣的話接受的參數就是倆個別名,他們分別是主函數中a b的別名,因爲別名和自身一樣所以結果就改變了
主程序前: a:3 b:4
前: a:3 b:4
後: a:4 b:3
主程序前: a:4 b:3
可以看到用值傳遞一不小心就達不到目的了,用地址傳遞的話寫法會比較困難,不小心會出錯,用引用傳遞的話考慮的問題就沒有那麼多了,我們就可以放心的使用了,寫函數的時候用引用,那麼調用的時候就不用考慮太多了.