ผ่านโดยอ้างอิงในค


204

ถ้า C ไม่สนับสนุนการส่งตัวแปรโดยการอ้างอิงทำไมถึงใช้งานได้?

#include <stdio.h>

void f(int *j) {
  (*j)++;
}

int main() {
  int i = 20;
  int *p = &i;
  f(p);
  printf("i = %d\n", i);

  return 0;
}

เอาท์พุท:

$ gcc -std=c99 test.c
$ a.exe
i = 21 

22
ที่ไหนในรหัสนี้คุณจะผ่านการอ้างอิง ?
Atul

15
ควรสังเกตว่า C ไม่ได้ผ่านการอ้างอิงสามารถเลียนแบบได้โดยใช้พอยน์เตอร์
โปรแกรมเมอร์บางคนเพื่อน

6
คำสั่งที่ถูกต้องคือ "C ไม่สนับสนุนโดยปริยายผ่านตัวแปรโดยอ้างอิง" - คุณต้องชัดเจนสร้างการอ้างอิง (กับ&) ก่อนที่จะเรียกฟังก์ชั่นและชัดเจน dereference มัน (กับ*) ในการทำงาน
Chris Dodd

2
รหัสของคุณเอาท์พุทเท่ากับเมื่อโทรf(&i);นี่คือการดำเนินการผ่านโดยอ้างอิงซึ่งไม่มีอยู่ใน C. C ผ่านโดยอ้างอิง
EsmaeelE

@Someprogrammerdude ผ่านตัวชี้กำลังผ่านอ้างอิง นี่น่าจะเป็นข้อเท็จจริงอย่างหนึ่งที่โปรแกรมเมอร์ซี "เข้าใจ" ภูมิใจในตัวเอง เหมือนพวกเขาได้เตะจากมัน "โอ้คุณอาจจะคิดว่า C มีการอ้างอิงถึงแบบผ่าน แต่ไม่มีจริง ๆ แล้วมันเป็นเพียงแค่ค่าของที่อยู่หน่วยความจำที่ถูกส่งผ่าน Harharhar" การส่งผ่านการอ้างอิงหมายถึงการส่งผ่านที่อยู่หน่วยความจำของที่เก็บตัวแปรมากกว่าค่าของตัวแปรเอง นั่นคือสิ่งที่ C อนุญาตและมันเป็นแบบ pass-by-reference ทุกครั้งที่คุณผ่านตัวชี้เนื่องจากตัวชี้เป็นการอ้างอิงไปยังตำแหน่งหน่วยความจำตัวแปร
YungGun

คำตอบ:


315

เนื่องจากคุณกำลังส่งค่าของตัวชี้ไปยังเมธอดจากนั้นทำการยกเลิกการอ้างอิงเพื่อรับจำนวนเต็มที่ชี้


4
f (P); -> นี่หมายความว่าผ่านค่าหรือไม่ จากนั้นทำการยกเลิกการลงทะเบียนเพื่อรับจำนวนเต็มที่ชี้ไป -> คุณช่วยอธิบายเพิ่มเติมได้ไหม
bapi

4
@bapi การยกเลิกการอ้างอิงตัวชี้หมายถึง "รับค่าที่ตัวชี้นี้อ้างถึง"
Rauni Lillemets

สิ่งที่เราเรียกหาวิธีการเรียกใช้ฟังก์ชันที่รับแอดเดรสของตัวแปรแทนที่จะส่งผ่านตัวชี้ ตัวอย่าง: func1 (int & a) นี่ไม่ใช่การโทรโดยการอ้างอิงใช่ไหม ในกรณีนี้การอ้างอิงจริง ๆ และในกรณีของตัวชี้เรายังคงผ่านตามตัวอักษรเพราะเรากำลังผ่านตัวชี้ตามค่าเท่านั้น
Jon Wheelock

1
เมื่อใช้พอยน์เตอร์ความจริงที่สำคัญคือสำเนาของตัวชี้ถูกส่งผ่านไปยังฟังก์ชัน ฟังก์ชั่นนั้นใช้ตัวชี้นั้นไม่ใช่แบบดั้งเดิม สิ่งนี้ยังคงมีการส่งต่อตามตัวอักษร แต่ก็ใช้งานได้
Danijel

1
@Danijel เป็นไปได้ที่จะส่งตัวชี้ที่ไม่ใช่สำเนาของสิ่งใด ๆ ไปยังการเรียกใช้ฟังก์ชัน ตัวอย่างเช่นการเรียกใช้ฟังก์ชันfunc: func(&A);สิ่งนี้จะส่งตัวชี้ไปยัง A ไปยังฟังก์ชันโดยไม่คัดลอกสิ่งใด ๆ มันเป็นค่า pass-by-value แต่ค่านั้นเป็นข้อมูลอ้างอิงดังนั้นคุณจึง 'ส่งผ่านค่าอ้างอิง' ตัวแปร A ไม่จำเป็นต้องคัดลอก มันถูกต้องที่จะบอกว่ามันผ่านการอ้างอิง
YungGun

124

ที่ไม่ผ่านการอ้างอิงนั่นคือ pass-by-value ตามที่คนอื่น ๆ ระบุไว้

ภาษา C คือการส่งต่อค่าโดยไม่มีข้อยกเว้น การส่งตัวชี้เป็นพารามิเตอร์ไม่ได้หมายถึงการส่งต่อแบบอ้างอิง

กฎมีดังต่อไปนี้:

ฟังก์ชั่นไม่สามารถเปลี่ยนค่าพารามิเตอร์จริง


ลองดูความแตกต่างระหว่างพารามิเตอร์สเกลาร์และตัวชี้ของฟังก์ชัน

ตัวแปรสเกลาร์

โปรแกรมสั้น ๆ นี้แสดงการส่งต่อค่าโดยใช้ตัวแปรสเกลาร์ paramเรียกว่าพารามิเตอร์อย่างเป็นทางการและvariableที่ฟังก์ชั่นการภาวนาเรียกว่าพารามิเตอร์จริง หมายเหตุการเพิ่มฟังก์ชั่นไม่เปลี่ยนแปลงparamvariable

#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หลังจากการเรียกใช้ฟังก์ชัน


69

ใน C Pass-by-Reference จะถูกจำลองโดยส่งผ่านที่อยู่ของตัวแปร (ตัวชี้) และยกเลิกการกำหนดที่อยู่ภายในฟังก์ชันเพื่ออ่านหรือเขียนตัวแปรจริง สิ่งนี้จะถูกเรียกว่า "C style pass-by-reference"

ที่มา: www-cs-students.stanford.edu


50

เนื่องจากไม่มีรหัสผ่านอ้างอิงในรหัสด้านบน การใช้พอยน์เตอร์ (เช่นvoid func(int* p)) คือการผ่านที่อยู่ นี่คือรหัสผ่านใน C ++ (จะไม่ทำงานใน C):

void func(int& ref) {ref = 4;}

...
int a;
func(a);
// a is 4 now

1
ฉันชอบคำตอบแบบส่งผ่านที่อยู่ ทำให้รู้สึกมากขึ้น
Afzaal Ahmad Zeeshan

ที่อยู่และการอ้างอิงมีความหมายเหมือนกันในบริบทนี้ แต่คุณสามารถใช้คำเหล่านั้นเพื่อแยกความแตกต่างทั้งสองมันก็ไม่ตรงกับความหมายเดิมของพวกเขา
YungGun

27

ตัวอย่างของคุณทำงานได้เพราะคุณจะผ่านอยู่ของตัวแปรของคุณเพื่อฟังก์ชั่นที่ปรุงแต่งความคุ้มค่ากับผู้ประกอบการ dereference

ในขณะที่ C ไม่รองรับชนิดข้อมูลอ้างอิงคุณยังสามารถจำลองการส่งต่ออ้างอิงโดยการส่งค่าตัวชี้อย่างชัดเจนเช่นในตัวอย่างของคุณ

ชนิดข้อมูลอ้างอิง C ++ นั้นมีประสิทธิภาพน้อยกว่า แต่ถือว่าปลอดภัยกว่าประเภทตัวชี้ที่สืบทอดมาจาก C นี่คือตัวอย่างของคุณซึ่งปรับให้ใช้การอ้างอิง C ++ :

void f(int &j) {
  j++;
}

int main() {
  int i = 20;
  f(i);
  printf("i = %d\n", i);

  return 0;
}

3
บทความ Wikipedia นั้นเกี่ยวกับ C ++ ไม่ใช่ C มีการอ้างอิงอยู่ก่อน C ++ และไม่ต้องอาศัยไวยากรณ์ C ++ พิเศษที่มีอยู่

1
@Roger: จุดดี ... ฉันลบการอ้างอิงที่ชัดเจนถึง C ++ ออกจากคำตอบของฉัน
Daniel Vassallo

1
และบทความใหม่บอกว่า "การอ้างอิงมักจะเรียกว่าตัวชี้" ซึ่งไม่ใช่สิ่งที่คำตอบของคุณพูด

12

คุณผ่านตัวชี้ (ตำแหน่งที่อยู่) โดยค่า

มันเหมือนกับการพูดว่า "นี่คือสถานที่ที่มีข้อมูลที่ฉันต้องการให้คุณอัปเดต"


6

p เป็นตัวแปรตัวชี้ ค่าของมันคือที่อยู่ของ i เมื่อคุณโทรหา f คุณจะผ่านค่าของ p ซึ่งเป็นที่อยู่ของ i



5

ใน C ทุกอย่างคือการผ่านค่า การใช้พอยน์เตอร์ทำให้เราเห็นภาพลวงตาที่เรากำลังผ่านการอ้างอิงเพราะคุณค่าของการเปลี่ยนแปลงตัวแปร อย่างไรก็ตามหากคุณต้องพิมพ์ที่อยู่ของตัวแปรพอยน์เตอร์คุณจะเห็นว่าไม่ได้รับผลกระทบ สำเนาของมูลค่าของที่อยู่จะถูกส่ง-in เพื่อฟังก์ชั่น ด้านล่างนี้เป็นตัวอย่างข้อมูลที่แสดงให้เห็นว่า

void add_number(int *a) {
    *a = *a + 2;
}

int main(int argc, char *argv[]) {
   int a = 2;

   printf("before pass by reference, a == %i\n", a);
   add_number(&a);
   printf("after  pass by reference, a == %i\n", a);

   printf("before pass by reference, a == %p\n", &a);
   add_number(&a);
   printf("after  pass by reference, a == %p\n", &a);

}

before pass by reference, a == 2
after  pass by reference, a == 4
before pass by reference, a == 0x7fff5cf417ec
after  pass by reference, a == 0x7fff5cf417ec

4

เพราะคุณกำลังส่งพอยน์เตอร์ (ที่อยู่หน่วยความจำ) ไปยังตัวแปร p เข้าสู่ฟังก์ชัน f คุณกำลังผ่านตัวชี้ไม่ใช่การอ้างอิง


4

คำตอบสั้น ๆ : ใช่ C ใช้การส่งพารามิเตอร์โดยการอ้างอิงโดยใช้พอยน์เตอร์

ในขณะที่การนำพารามิเตอร์ไปใช้ผู้ออกแบบภาษาการเขียนโปรแกรมใช้กลยุทธ์ที่แตกต่างกันสามแบบ (หรือแบบจำลองความหมาย): ถ่ายโอนข้อมูลไปยังโปรแกรมย่อยรับข้อมูลจากโปรแกรมย่อยหรือทำทั้งสองอย่าง โมเดลเหล่านี้เป็นที่รู้จักกันทั่วไปว่าเป็นในโหมด, โหมดออก, และโหมด inout ตามลำดับ

หลายรุ่นได้รับการออกแบบโดยนักออกแบบภาษาเพื่อใช้กลยุทธ์การส่งผ่านพารามิเตอร์เบื้องต้นทั้งสามนี้:

Pass-by-Value (ในความหมายของโหมด) Pass-by-Value (ความหมายของโหมดออก) Pass-by-Value (ผลลัพธ์ความหมายโหมด inout) Pass-by-Value (ความหมายโหมด inout) Pass-by-Reference ความหมาย)

Pass-by-Reference เป็นเทคนิคที่สองสำหรับการผ่านพารามิเตอร์ในโหมด แทนที่จะคัดลอกข้อมูลไปมาระหว่างรูทีนหลักและโปรแกรมย่อยระบบรันไทม์ส่งเส้นทางการเข้าถึงโดยตรงไปยังข้อมูลสำหรับโปรแกรมย่อย ในกลยุทธ์นี้โปรแกรมย่อยมีการเข้าถึงข้อมูลโดยตรงแบ่งปันข้อมูลได้อย่างมีประสิทธิภาพด้วยรูทีนหลัก ข้อได้เปรียบหลักของเทคนิคนี้คือมีประสิทธิภาพในเวลาและสถานที่เพราะไม่จำเป็นต้องทำซ้ำพื้นที่และไม่มีการคัดลอกข้อมูล

การใช้พารามิเตอร์ที่ผ่านใน C: C ใช้การส่งต่อตามค่าและซีแมนทิกส์แบบบายพาสโดยอ้างอิง (โหมด inout) โดยใช้พอยน์เตอร์เป็นพารามิเตอร์ ตัวชี้ถูกส่งไปยังโปรแกรมย่อยและไม่มีการคัดลอกข้อมูลจริงเลย อย่างไรก็ตามเนื่องจากตัวชี้เป็นเส้นทางการเข้าถึงข้อมูลของรูทีนหลักโปรแกรมย่อยอาจเปลี่ยนข้อมูลในรูทีนหลัก C ใช้วิธีนี้จาก ALGOL68

พารามิเตอร์การใช้งานผ่านใน C ++: C ++ ยังใช้ซีแมนทิกส์แบบอ้างอิงถึงกัน (โหมด inout) โดยใช้พอยน์เตอร์และใช้พอยน์เตอร์ชนิดพิเศษที่เรียกว่าประเภทการอ้างอิง พอยน์เตอร์ประเภทการอ้างอิงนั้นถูกอ้างถึงในโปรแกรมย่อยโดยปริยาย แต่ความหมายของมันก็เป็นแบบ pass-by-reference

ดังนั้นแนวคิดหลักของที่นี่คือการอ้างอิงแบบอ้างอิงถึงใช้พา ธ การเข้าถึงไปยังข้อมูลแทนที่จะคัดลอกข้อมูลลงในโปรแกรมย่อย เส้นทางการเข้าถึงข้อมูลอาจเป็นตัวชี้การยกเลิกการลงทะเบียนอย่างชัดเจนหรือตัวชี้การยกเลิกการลงทะเบียนอัตโนมัติ (ประเภทการอ้างอิง)

สำหรับข้อมูลเพิ่มเติมโปรดดูที่หนังสือแนวคิดของการเขียนโปรแกรมภาษาโดย Robert Sebesta, 10th Ed, บทที่ 9


3

คุณไม่ได้ผ่าน int โดยการอ้างอิงคุณจะผ่านตัวชี้ไปยังค่า int ไวยากรณ์ที่แตกต่างความหมายเดียวกัน


1
+1 "ไวยากรณ์ที่แตกต่างความหมายเดียวกัน" .. ดังนั้นสิ่งเดียวกันในขณะที่ความหมายสำคัญกว่าไวยากรณ์

ไม่จริง. โดยการเรียกvoid func(int* ptr){ *ptr=111; int newValue=500; ptr = &newvalue }ด้วยint main(){ int value=0; func(&value); printf("%i\n",value); return 0; }มันพิมพ์ 111 แทน 500 ถ้าคุณผ่านการอ้างอิงก็ควรพิมพ์ 500 C ไม่สนับสนุนพารามิเตอร์ผ่านโดยอ้างอิง
Konfle Dolex

@Konfle หากคุณผ่าน syntactically โดยการอ้างอิงptr = &newvalueจะไม่ได้รับอนุญาต โดยไม่คำนึงถึงความแตกต่างที่ผมคิดว่าคุณจะชี้ให้เห็นว่า "ความหมายเหมือนกัน" ไม่ได้ว่าจริงเพราะคุณยังมีฟังก์ชันการทำงานพิเศษใน C (ความสามารถในการกำหนดใหม่ "อ้างอิง" ตัวเอง)
xan

เราไม่เคยเขียนบางอย่างเช่นptr=&newvalueถ้ามันถูกส่งผ่านโดยการอ้างอิง แต่เราเขียนptr=newvalueนี่คือตัวอย่างใน C ++: void func(int& ptr){ ptr=111; int newValue=500; ptr = newValue; }ค่าของพารามิเตอร์ผ่านเข้าสู่ func () 500ที่จะกลายเป็น
Konfle Dolex

ในกรณีที่ความคิดเห็นของฉันด้านบนมันไม่มีประโยชน์ที่จะผ่านพารามิเตอร์โดยการอ้างอิง อย่างไรก็ตามหากพารามิเตอร์เป็นวัตถุแทนที่จะเป็น POD สิ่งนี้จะสร้างความแตกต่างอย่างมีนัยสำคัญเนื่องจากการเปลี่ยนแปลงใด ๆ หลังจากparam = new Class()ภายในฟังก์ชั่นจะไม่มีผลกระทบต่อผู้โทรหากมันถูกส่งโดยค่า (ตัวชี้) หากparamถูกส่งผ่านโดยการอ้างอิงการเปลี่ยนแปลงจะมองเห็นได้สำหรับผู้โทร
Konfle Dolex

3

ใน C เพื่อผ่านการอ้างอิงคุณใช้ที่อยู่ของผู้ประกอบการ&ซึ่งควรใช้กับตัวแปร แต่ในกรณีของคุณเนื่องจากคุณใช้ตัวแปรตัวชี้pคุณไม่จำเป็นต้องนำหน้าด้วยตัวดำเนินการที่อยู่ของ ก็จะได้รับความจริงถ้าคุณใช้เป็นพารามิเตอร์:&if(&i)

คุณยังสามารถเพิ่มสิ่งนี้เพื่ออ้างอิงpและดูว่าค่านั้นตรงกับi:

printf("p=%d \n",*p);

ทำไมคุณถึงรู้สึกว่าจำเป็นต้องทำซ้ำรหัสทั้งหมด (รวมถึงบล็อกความคิดเห็นนั้น .. ) เพื่อบอกเขาว่าเขาควรเพิ่ม printf?

@Neil: ข้อผิดพลาดนั้นได้รับการแนะนำโดยการแก้ไขของ @ William ฉันจะย้อนกลับตอนนี้ และตอนนี้เห็นได้ชัดว่า tommieb นั้นถูกต้องเป็นส่วนใหญ่: คุณสามารถนำไปใช้กับวัตถุใด ๆ ไม่ใช่แค่ตัวแปร

2

พอยน์เตอร์และการอ้างอิงเป็นสอง Thigngs ที่แตกต่างกัน

สองสิ่งที่ฉันไม่เคยเห็นมาก่อน

ตัวชี้คือที่อยู่ของบางสิ่งบางอย่าง ตัวชี้สามารถจัดเก็บและคัดลอกเหมือนตัวแปรอื่น ๆ มันจึงมีขนาด

การอ้างอิงควรถูกมองว่าเป็นนามแฝงของบางสิ่งบางอย่าง มันไม่มีขนาดและไม่สามารถจัดเก็บได้ มันจะต้องอ้างอิงบางสิ่งบางอย่างเช่น ไม่สามารถเป็นโมฆะหรือเปลี่ยนแปลงได้ บางครั้งคอมไพเลอร์จำเป็นต้องเก็บการอ้างอิงเป็นตัวชี้ แต่นั่นคือรายละเอียดการใช้งาน

ด้วยการอ้างอิงคุณไม่มีปัญหากับพอยน์เตอร์เช่นการจัดการความเป็นเจ้าของการตรวจสอบโมฆะการยกเลิกการอ้างอิงในการใช้งาน


1

'ส่งผ่านการอ้างอิง' (โดยใช้ตัวชี้) อยู่ใน C ตั้งแต่ต้น ทำไมคุณถึงคิดว่ามันไม่


7
เพราะในทางเทคนิคแล้วมันไม่ได้ผ่านการอ้างอิง
Mehrdad Afshari

7
การส่งค่าตัวชี้ไม่เหมือนกับการส่งต่อโดยอ้างอิง การอัปเดตค่าของj( ไม่ *j ) ในf()ไม่มีผลต่อในi main()
John Bode

6
มันมีความหมายเหมือนกับการส่งต่อโดยอ้างอิงและมันก็ดีพอที่จะบอกว่ามันผ่านการอ้างอิง จริงมาตรฐาน C ไม่ได้ใช้คำว่า "อ้างอิง" แต่ก็ไม่ทำให้ฉันประหลาดใจและไม่มีปัญหา เรายังไม่ได้พูดมาตรฐานบน SO แม้ว่าเราอาจอ้างถึงมาตรฐานมิฉะนั้นเราจะไม่เห็นใครพูดถึงค่านิยม (มาตรฐาน C ไม่ใช้คำนั้น)

4
@ จิม: ขอบคุณที่บอกพวกเราว่าเป็นเพราะคุณแสดงความคิดเห็นกับจอห์น

1

ฉันคิดว่า C อันที่จริงรองรับการอ้างอิงผ่าน

ภาษาส่วนใหญ่ต้องการน้ำตาลซินแทคติกเพื่อส่งต่อโดยอ้างอิงแทนค่า (ตัวอย่างเช่น C ++ ต้องการ & ในการประกาศพารามิเตอร์)

C ยังต้องใช้น้ำตาลซินแทคติกสำหรับสิ่งนี้ เป็น * ในการประกาศชนิดพารามิเตอร์และ & บนอาร์กิวเมนต์ ดังนั้น * และ & คือไวยากรณ์ C สำหรับการส่งผ่านโดยการอ้างอิง

ขณะนี้สามารถยืนยันว่าการอ้างอิงจริงโดยการอ้างอิงควรใช้ไวยากรณ์ในการประกาศพารามิเตอร์เท่านั้นไม่ใช่ในด้านอาร์กิวเมนต์

แต่ตอนนี้มา C # ซึ่งไม่สนับสนุนโดยผ่านการอ้างอิงและต้องใช้น้ำตาลประโยคบนทั้งพารามิเตอร์และโต้แย้งด้าน

อาร์กิวเมนต์ที่ C ไม่มีการผ่านโดยอ้างอิงทำให้องค์ประกอบทางไวยากรณ์เพื่อแสดงมันแสดงให้เห็นถึงการใช้งานทางเทคนิคพื้นฐานไม่ได้เป็นข้อโต้แย้งที่ทุกคนเช่นนี้ใช้มากหรือน้อยในการใช้งานทั้งหมด

อาร์กิวเมนต์ที่เหลืออยู่เพียงอย่างเดียวคือการส่งต่อโดยอ้างอิงใน C ไม่ใช่คุณลักษณะแบบเสาหิน แต่รวมสองคุณลักษณะที่มีอยู่ (รับการโต้แย้งโดย & คาดว่า ref จะพิมพ์ด้วย *.) ตัวอย่างเช่น C # ต้องการองค์ประกอบสองประโยค แต่ไม่สามารถใช้งานได้หากไม่มีกันและกัน

เห็นได้ชัดว่านี่เป็นข้อโต้แย้งที่อันตรายทำให้มีคุณสมบัติอื่น ๆ มากมายในภาษาที่ประกอบด้วยคุณสมบัติอื่น ๆ (เช่นการสนับสนุนสตริงใน C ++)


1

สิ่งที่คุณกำลังทำคือการส่งผ่านค่าไม่ผ่านการอ้างอิง เนื่องจากคุณกำลังส่งค่าของตัวแปร 'p' ไปยังฟังก์ชัน 'f' (ใน main เป็น f (p);)

โปรแกรมเดียวกันใน C พร้อม pass โดยการอ้างอิงจะมีลักษณะ (!!! โปรแกรมนี้ให้ 2 ข้อผิดพลาดเนื่องจาก C ไม่รองรับการอ้างอิงผ่าน)

#include <stdio.h>

void f(int &j) {    //j is reference variable to i same as int &j = i
  j++;
}

int main() {
  int i = 20;
  f(i);
  printf("i = %d\n", i);

  return 0;
}

เอาท์พุท: -

3:12: ข้อผิดพลาด: คาดว่า ';', ',' หรือ ')' ก่อนหน้าโทเค็น '&'
             เป็นโมฆะ f (int & j);
                        ^
9: 3: คำเตือน: การประกาศโดยนัยของฟังก์ชัน 'f'
               f (ก);
               ^
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.