《斯坦福大學:編程範式》第三節3:* 與&的真正含義

  這一節再續寫一篇。由於要足夠多的例子才能說清楚*這個符號。函數

 

  * ,中國翻譯爲「解引用」,初聽很拗口,其實是很是貼切的翻譯。若是將它翻譯爲取值,其實很差。佈局

 咱們繼續舉例說明: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指針,因此把左邊的值,賦值給四個字節。

 

因此咱們能夠看到,* 的意義,是解引用,再也不引用的意思,表明直接移動到被引用的內存上。 後續的具體意義依賴於具體環境。

 

嗯,本質上,* 符號就意思是,在位模式上去執行。

因此 剛纔的賦值,就是位模式的拷貝。

 

咱們發現 只要 內存佈局相同,就能夠成功獲得咱們想要的結果。

好比 類/結構體的拷貝。

相關文章
相關標籤/搜索