這三者就看你函數參數到底是一個普通變量還是引用還是一個指針
我看了一個博主的講的不錯
傳送門:https://www.cnblogs.com/dingxiaoqiang/p/8012578.html
上面已經解釋了這三者的一些特點,我接下來就講講這三者什么時候用
這取決於你的目的
1.如果你不想改變實參的值,而只是在函數里對形參進行修改就用值傳遞
形參是實參的拷貝,改變形參的值並不會影響外部實參的值
2.如果你想主函數的值和在被調函數里的修改的值同步修改就指針傳遞
形參為指向實參地址的指針,當對形參的指向操作時,就相當於對實參本身進行的操作
它不需要拷貝那么多數據,當然引用傳遞也可以,但二者還是有區別的
指針是一個實體(替身);引用只是一個別名(本體的另一個名字)
引用只能在定義時被初始化一次,之后不可改變,即“從一而終”;指針可以修改,即“見異思遷”;
引用不能為空(有本體,才有別名);指針可以為空;
sizeof 引用,得到的是所指向變量的大小;sizeof 指針,得到的是指針的大小;
指針 ++,是指指針的地址自增;引用++是指所指變量自增;
引用是類型安全的,引用過程會進行類型檢查;指針不會進行安全檢查;

1 #include<bits/stdc++.h> 2 using namespace std; 3 4 void f1(int x) 5 { 6 cout << &x << " " << x << endl; 7 x++; 8 } 9 10 void f2(int &x) 11 { 12 cout << &x << " " << x << endl; 13 x++; 14 } 15 16 void f3(int *x) 17 { 18 cout << x << " " << *x << endl; 19 *x = *x + 1; 20 } 21 22 int main() 23 { 24 int a = 110; 25 cout << "Actual address--" << &a << " " << a << endl; 26 27 f1(a); 28 cout << "Actual address--" << &a << " " << a << endl; 29 30 f2(a); 31 cout << "Actual address--" << &a << " " << a << endl; 32 33 f3(&a); 34 cout << "Actual address--" << &a << " " << a << endl; 35 36 return 0; 37 }
還有就是如果要傳遞參數包含的東西比較多的話,可以用指針傳遞。因為這個時候只需拷貝一個地址減少內存空間消耗
然后如果你不想修改的話,可以用const修飾
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct stu{ 4 string name; 5 int age,score; 6 }; 7 8 void print(const stu *s) 9 { 10 //s->age = 99;是不允許的,因為s是一個指向常量的指針 11 cout << s->name << " " << s->age << " " << s->score << endl; 12 } 13 int main() 14 { 15 stu s = {"Steve",50,99}; 16 print(&s); 17 return 0; 18 }