前言
身為一個初學者,不是說引用和指針難學,而是他們定義和使用的方式非常令人迷惑,定義和使用,該用&
還是不該用&
, 該用*
還是不該用*
,這是一個讓我非常迷惑的事情。所以專門寫了測試方法來進行測試,看看到底怎么使用。
引用
通常定義一個引用,就要使用到 & 符號。這個東西的意義非常多,很容易就弄混了。為此專門寫了個測試,來說明這些符號到底有什么用,怎么用的。
int v = 10;
int &vv = v;
std::cout << "vv:"<< vv << std::endl;
std::cout << "&vv:" << &vv << std::endl;
std::cout << "&v:" << &v << std::endl;
輸出是:
vv:10
&vv:0x7fff5704e9fc
&v:0x7fff5704e9fc
v是一個int值,&
在一般的情況下,表示一個取地址的操作。剛學習C++,很容易把所有的&都想成是取地址,這樣在&表示一個引用的時候,就會有很大的問題。在定義一個引用的時候,&就表示引用,沒有別的含義。如果你把&當成是一個取地址,你就會陷入模糊。int &vv = v 就會被誤解,取vv的地址是v?v在這里是10,vv的地址是10?這明顯是錯誤的。這個時候,&就僅僅表示引用的定義,沒有其他的含義了。當用的時候,就直接使用 vv
就好了。vv就直接表示v,而&vv則表示vv指向的地址。可以看到,&vv和&v打印的地址相同。
使用引用
vv = 20;
std::cout << "vv:" << vv << std::endl;
std::cout << "&vv:" << &vv << std::endl;
std::cout << "v:" << v << std::endl;
輸出為:
vv:20
&vv:0x7fff5704e9fc
v:20
可以看到,直接使用vv
就可以直接賦值了。如果使用:
&vv=20; //這樣使用就會出錯,直接把20當地址賦值,是錯誤的。
指針
*
一般的意思就是取出地址對應的值。先看代碼:
int t = 10;
int *p = &t;
std::cout << "p:" << p << std::endl;
std::cout << "*p:" << *p << std::endl;
輸出為:
p:0x7fff5704ea0c
*p:10
指針定義和賦值就和引用不一樣了。看 int *p = &t
這句,右邊&t,表示取到了t的地址,右邊是一個地址,左邊也應該是一個地址了。實質上 int *p 里面,int *才是p的類型,所以被賦值的實質上是p,也就是說p是t的地址。這下就恍然大悟了。
指針使用
*p = 200;
std::cout << "p:" << p << std::endl;
std::cout << "*p:" << *p << std::endl;
std::cout << "t:" << t << std::endl;
輸出為:
p:0x7fff5704ea0c
*p:200
t:200
指針的使用應該比較簡單了,p就是你理解的意思,就是指向了p的地址對應的值,此時p就是t,既然*p賦值了200,則t也被賦值了200。
結語
指針和引用的知識都是很基礎的,經常混淆,為了明白他們,先要弄清楚定義和如何使用,高深的知識我也還不明白,總之,先弄清楚基礎,是沒有錯的~