C 語言指標補充:pass by value / pass by reference

閱讀時間約 4 分鐘

延續上一篇的指標,補充 pass by value 和 pass by reference 的差別。

C 語言指標-程式碼圖解

當我們在程式中呼叫函數時,變數的傳遞方式有兩種:pass by valuepass by reference。這兩者的區別主要在於傳遞的是「值」還是「記憶體位置的參考」。

這個情況在交換數值的時候會特別明顯。

Pass by Value

當變數是以值傳遞時,函數接收到的只是該變數的「複製品/副本」,而非原始的變數。換句話說,在函數中對這個變數的操作,不會影響到主程式(main())中原本的變數

舉例來說,如果遇到 x 和 y 交換的情況但其實是複製地址,不是複製值。

假設我要交換 x 和 y 的值。我的直覺是,設定一個暫時的參數,並讓他們交換。

#include <stdio.h>
#include <cs50.h>

void swap (int a, int b);

int main(void)
{
int x = 1;
int y = 2;

printf("x is %i, y is %i\n",x,y);
swap(x,y);
printf("x is %i, y is %i\n",x,y);
}

void swap (int a, int b)
{
int tmp = a; //a先丟掉tmp裡面
a = b; //此時a的位置是空的,再把b丟進去
b = tmp; // b的位置變空了,再把a從tmp撈回來
}
raw-image

但出來的結果卻沒有交換,為什麼呢?


raw-image

因為實際在記憶體的寫在 main 裡面的 function 跟 main 外的 function 存的方式不太同個平面。

所以 swap中的 x 和 y 並非等於 main。而只是他的「副本」(copy)。

這時候只是pass by value。

raw-image

那這樣怎麼解決呢?

Pass by reference

參考傳遞則完全不同,它傳遞的是變數的「記憶體位置」。因此,函數可以直接操作原變數,而不只是操作一個副本。這樣的傳遞方式在需要修改變數內容時特別有用。

讓他指向值,指向 a 和 b 代表的地址,所以程式碼就要改成:

raw-image
#include <stdio.h>
#include <cs50.h>

void swap (int *a, int *b);

int main(void)
{
int x = 1;
int y = 2;

printf("x is %i, y is %i\n",x,y);
swap(&x,&y); // 記得丟進去的是指向x和y的地址,所以要加&
printf("x is %i, y is %i\n",x,y);
}

void swap (int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
raw-image

總結:

想像你有兩個人要交換手中的兩件物品:

  • 在 pass by value 的情境下,這兩個人都拿著物品的照片(副本),彼此交換照片,但實際的物品並沒有改變。
  • 在 pass by reference 的情境下,他們交換的是實體物品,這樣物品的擁有者也會發生變動。


留言0
查看全部
avatar-img
發表第一個留言支持創作者!
大魔王指標:初學者的天堂路。 指標(Pointer)是 C 語言裡的「大魔王」,是資工系學生花了至少 9 小時上的課。我們一起用 18 分鐘文章快速了解指標的基本概念,中間在字串的部分我將結果和程式碼做對照。最後,我會將我跟 ChatGPT 對話放上來跟大家一起學習。
本篇文章探討計算機理論中的 P/NP 問題,分析其在演算法和理論計算中的重要性。透過回溯法及圖靈機的介紹,讀者將更瞭解 P 問題與 NP 問題的區別,以及它們在解決複雜問題中的挑戰。最後,我們將提及停機問題,揭示計算機在面對某些問題時的侷限性。
上次我們提到了演算法(algorithm),它是一種解決問題的方式。但演算法只是資料結構與演算法(Data Structures and Algorithms, DSA)這個領域的一部分。今天,我們要進一步探索這個主題,了解它的核心概念。 什麼是資料結構與演算法呢?簡單來說,資料結構是用來組織和存
上回提到,演算法是一種解決問題的方法。光是簡單的將數字有小排到大就有很多種不同的排序演算法可以選擇。這次,我們來介紹幾個常見的排序演算法,看看它們是怎麼運作的。
演算法是一種解決問題的虛擬邏輯,他不像 C 語言有直接的程式碼,而是一種虛擬的問題解決方式。 想像一下,今天要在字典裡面找到 Zoo,有幾種方法: 逐頁查找:如果字典有 1000 頁,最糟情況下需要翻 1000 次 才能找到。 兩頁兩頁找:這樣的話,1000 頁最多要翻 500 次。 二分查
在上一篇文章中,我們介紹了「陣列」的基本使用方式。本篇將帶你深入探討 C 語言中字串的運作原理,了解如何以陣列形式儲存字串。此外,我們還會介紹如何將英文字母透過 ASCII 表轉換成數值,並說明其在電腦中的實際應用。最後,解析 Command Line Argument(命令列參數)的使用方法。
大魔王指標:初學者的天堂路。 指標(Pointer)是 C 語言裡的「大魔王」,是資工系學生花了至少 9 小時上的課。我們一起用 18 分鐘文章快速了解指標的基本概念,中間在字串的部分我將結果和程式碼做對照。最後,我會將我跟 ChatGPT 對話放上來跟大家一起學習。
本篇文章探討計算機理論中的 P/NP 問題,分析其在演算法和理論計算中的重要性。透過回溯法及圖靈機的介紹,讀者將更瞭解 P 問題與 NP 問題的區別,以及它們在解決複雜問題中的挑戰。最後,我們將提及停機問題,揭示計算機在面對某些問題時的侷限性。
上次我們提到了演算法(algorithm),它是一種解決問題的方式。但演算法只是資料結構與演算法(Data Structures and Algorithms, DSA)這個領域的一部分。今天,我們要進一步探索這個主題,了解它的核心概念。 什麼是資料結構與演算法呢?簡單來說,資料結構是用來組織和存
上回提到,演算法是一種解決問題的方法。光是簡單的將數字有小排到大就有很多種不同的排序演算法可以選擇。這次,我們來介紹幾個常見的排序演算法,看看它們是怎麼運作的。
演算法是一種解決問題的虛擬邏輯,他不像 C 語言有直接的程式碼,而是一種虛擬的問題解決方式。 想像一下,今天要在字典裡面找到 Zoo,有幾種方法: 逐頁查找:如果字典有 1000 頁,最糟情況下需要翻 1000 次 才能找到。 兩頁兩頁找:這樣的話,1000 頁最多要翻 500 次。 二分查
在上一篇文章中,我們介紹了「陣列」的基本使用方式。本篇將帶你深入探討 C 語言中字串的運作原理,了解如何以陣列形式儲存字串。此外,我們還會介紹如何將英文字母透過 ASCII 表轉換成數值,並說明其在電腦中的實際應用。最後,解析 Command Line Argument(命令列參數)的使用方法。
你可能也想看
Google News 追蹤
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。