ที่ไม่ผ่านการอ้างอิงนั่นคือ pass-by-value ตามที่คนอื่น ๆ ระบุไว้
ภาษา C คือการส่งต่อค่าโดยไม่มีข้อยกเว้น การส่งตัวชี้เป็นพารามิเตอร์ไม่ได้หมายถึงการส่งต่อแบบอ้างอิง
กฎมีดังต่อไปนี้:
ฟังก์ชั่นไม่สามารถเปลี่ยนค่าพารามิเตอร์จริง
ลองดูความแตกต่างระหว่างพารามิเตอร์สเกลาร์และตัวชี้ของฟังก์ชัน
ตัวแปรสเกลาร์
โปรแกรมสั้น ๆ นี้แสดงการส่งต่อค่าโดยใช้ตัวแปรสเกลาร์ param
เรียกว่าพารามิเตอร์อย่างเป็นทางการและvariable
ที่ฟังก์ชั่นการภาวนาเรียกว่าพารามิเตอร์จริง หมายเหตุการเพิ่มฟังก์ชั่นไม่เปลี่ยนแปลงparam
variable
#include <stdio.h>
void function(int param) {
printf("I've received value %d\n", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %d\m", variable);
return 0;
}
ผลที่ได้คือ
I've received value 111
variable=111
ภาพลวงตาของการอ้างอิงผ่าน
เราเปลี่ยนชิ้นส่วนของรหัสเล็กน้อย param
เป็นตัวชี้ในขณะนี้
#include <stdio.h>
void function2(int *param) {
printf("I've received value %d\n", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %d\n", variable);
return 0;
}
ผลที่ได้คือ
I've received value 111
variable=112
นั่นทำให้คุณเชื่อว่าพารามิเตอร์นั้นถูกส่งผ่านโดยการอ้างอิง มันไม่ใช่ มันถูกส่งผ่านตามค่าค่าพารามิเตอร์เป็นที่อยู่ ค่า int type นั้นเพิ่มขึ้นและนั่นคือผลข้างเคียงที่ทำให้เราคิดว่ามันเป็นการเรียกฟังก์ชั่นแบบ pass-by-reference
พอยน์เตอร์ - ผ่านโดยค่า
เราจะแสดง / พิสูจน์ความจริงนั้นได้อย่างไร? บางทีเราสามารถลองตัวอย่างแรกของตัวแปรสเกลาร์ได้ แต่แทนที่จะใช้สเกลาร์เราใช้ที่อยู่ (ตัวชี้) เรามาดูกันว่าจะช่วยได้ไหม
#include <stdio.h>
void function2(int *param) {
printf("param's address %d\n", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %d\n", ptr);
return 0;
}
ผลลัพธ์จะเป็นที่อยู่สองที่เท่ากัน (ไม่ต้องกังวลเกี่ยวกับค่าที่แน่นอน)
ตัวอย่างผลลัพธ์:
param's address -1846583468
ptr's address -1846583468
ในความเห็นของฉันสิ่งนี้พิสูจน์ได้อย่างชัดเจนว่าพอยน์เตอร์นั้นผ่านตามตัวอักษร มิฉะนั้นptr
จะเกิดขึ้นNULL
หลังจากการเรียกใช้ฟังก์ชัน