這一節再續寫一篇。由於要足夠多的例子才能說清楚*這個符號。函數
* ,中國翻譯爲「解引用」,初聽很拗口,其實是很是貼切的翻譯。若是將它翻譯爲取值,其實很差。佈局
咱們繼續舉例說明:spa
void swap(int * ap, int* bp)
{
ap = bp;翻譯
}指針
int a = 5;
int b = 6;
swap(&a, &b);
printf("%d",a);
內存
咱們交換了 ap 跟bp的地址,打印出來,發現a的值並無變,爲何? 由於 int * ap bp是新的swap函數的棧上的臨時變量了,是一塊新的棧上內存存儲的。編譯器
a 和 b 的地址一直不變。 可是能夠有不少指針指向a和b,也就是指向a和b的地址首位,但 這些指針的地址能夠不一樣。編譯
假如咱們把 swap改成以下:變量
void swap(int * ap, int* bp)
{
*ap =*bp;引用
}
會發現 a的值變爲b的值了。
ap是一個指針,它有本身的內存空間。它經過指向了 存儲着5的那個地址, "引用"了該段內存。
* 符號,則是在執行過程當中,告訴編譯器,解開這個引用,直接移動到被指向的地址,開始操做。 因此叫 解引用。
它並非直接取被指向地址的值。因此 爲何 解引用 是最準確的翻譯。
因此, *bp,是移動到bp指針所指向的內存。
而後由於左邊是 「=」 表明賦值,由於是int指針,因此去拿這個內存的四個字節。
而後右邊,*ap,是移動到ap指針所指向的內存。
而後由於右邊是 「=」 表明被賦值嗎,由於是int指針,因此把左邊的值,賦值給四個字節。
因此咱們能夠看到,* 的意義,是解引用,再也不引用的意思,表明直接移動到被引用的內存上。 後續的具體意義依賴於具體環境。
嗯,本質上,* 符號就意思是,在位模式上去執行。
因此 剛纔的賦值,就是位模式的拷貝。
咱們發現 只要 內存佈局相同,就能夠成功獲得咱們想要的結果。
好比 類/結構體的拷貝。