ผลต่างระหว่างรุ่นของ "Psl/การส่งค่าไปยังฟังก์ชัน"
Jittat (คุย | มีส่วนร่วม) |
Jittat (คุย | มีส่วนร่วม) |
||
แถว 1: | แถว 1: | ||
− | : ''หน้านี้เป็นส่วนหนึ่งของวิชา [[Problem solving lab]]'' | + | : ''หน้านี้เป็นส่วนหนึ่งของวิชา [[Problem solving lab]]'' shortcut:[[Psl/function-args|Psl/function-args]] |
== argument กับ parameter == | == argument กับ parameter == |
รุ่นแก้ไขเมื่อ 22:12, 3 กุมภาพันธ์ 2561
- หน้านี้เป็นส่วนหนึ่งของวิชา Problem solving lab shortcut:Psl/function-args
เนื้อหา
argument กับ parameter
เพื่อความเข้าใจที่ตรงกัน เราจะพิจารณาความแตกต่างผ่านทางโค้ดด้านล่าง
void f(int x) // Line 1
{
//...
}
main()
{
int y = 10;
f(y); // Line 9
}
เรานิยมเรียก y ในบรรทัดที่ 9 ว่า argument (เป็นตัวแปรหรือค่าที่ส่งให้กับฟังก์ชัน) ในขณะที่จะเรียก x ว่าเป็น parameter (เป็นตัวแปรที่เราประกาศพร้อมกับฟังก์ชันเพื่อเอาไว้รับค่า)
หมายเหตุ ในการใช้ทั่วไปเราอาจจะใช้สลับกันได้ ถ้าต้องการให้ชัดเจนจริง ๆ เราจะเรียก parameter ที่ประกาศในฟังก์ชันว่า formal argument/parameter และเรียก argument ในการเรียกใช้ฟังก์ชันว่า actual argument/parameter (ตาม [1])
การส่งค่าแบบ pass by value
ในภาษา C การส่งค่าไปยังฟังก์ชันจะเป็นการส่งแบบ pass by value นั่นคือค่าจาก argument จะถูก copy ไปยังเนื้อที่ที่จองไว้สำหรับ parameter ในฟังก์ชัน ทำให้เราไม่สามารถแก้ค่าของ argument กลับไปยังจุดที่เรียกฟังก์ชันได้
void f(int x)
{
x = 100;
}
ในกรณีนี้ ไม่ว่าเราจะเรียกฟังก์ชัน f อย่างไร เราก็ไม่สามารถทำให้ f แก้ค่าตัวแปรที่ส่งค่ามาได้ เช่น
int y = 1000;
f(y); // at the end, y is still 1000.
ซึ่งก็เป็นพฤติกรรมปกติ เมื่อเราคิดว่าเราส่งค่าคงที่ หรือค่าอื่น ๆ ให้กับ f ก็ได้เช่นกัน ดังตัวอย่างด้านล่าง
f(500);
f(y*y);
ถ้าสามารถแก้ค่าจาก parameter x กลับมาได้ เราคงจะไม่รู้ว่าจะเอาค่ากลับมาที่ argument ที่ส่งไปได้อย่างไร
ด้วยเหตุผลที่กล่าวมา การพยายามจองค่า ListNode ในตัวอย่างด้านล่างจึงไม่สามารถส่งค่ากลับมาได้
void create_new_node(ListNode* head)
{
if(head == 0) {
head = new ListNode();
}
}
main()
{
// ...
ListNode* h = 0;
create_new_node(h);
// ...
}