คำถามติดแท็ก pass-by-reference

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

10
มันจะดีกว่าใน C ++ ที่จะผ่านค่าหรือผ่านการอ้างอิงคงที่?
มันจะดีกว่าใน C ++ ที่จะผ่านค่าหรือผ่านการอ้างอิงคงที่? ฉันสงสัยว่าวิธีไหนดีกว่ากัน ฉันรู้ว่าการส่งผ่านโดยการอ้างอิงอย่างต่อเนื่องควรให้ประสิทธิภาพที่ดีขึ้นในโปรแกรมเพราะคุณไม่ได้ทำสำเนาของตัวแปร

17
ผ่านโดยอ้างอิงในค
ถ้า 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

10
การใช้ "อ้างอิง" สำหรับตัวแปรประเภทการอ้างอิงใน C # คืออะไร?
ฉันเข้าใจว่าถ้าฉันผ่านค่าประเภท ( int,, structฯลฯ ) เป็นพารามิเตอร์ (โดยไม่มีrefคำหลัก) สำเนาของตัวแปรนั้นจะถูกส่งผ่านไปยังวิธีการ แต่ถ้าฉันใช้refคำหลักการอ้างอิงถึงตัวแปรนั้นจะถูกส่งผ่าน ไม่ใช่ใหม่ แต่ด้วยประเภทการอ้างอิงเช่นคลาสแม้ไม่มีrefคำหลักการอ้างอิงจะถูกส่งผ่านไปยังเมธอดไม่ใช่การคัดลอก ดังนั้นการใช้refคำหลักที่มีประเภทอ้างอิงคืออะไร? ยกตัวอย่างเช่น var x = new Foo(); ข้อแตกต่างระหว่างสิ่งต่อไปนี้คืออะไร? void Bar(Foo y) { y.Name = "2"; } และ void Bar(ref Foo y) { y.Name = "2"; }

7
ทำไม 128 == 128 false แต่ 127 == 127 เป็นจริงเมื่อเปรียบเทียบ Integer wrappers ใน Java
class D { public static void main(String args[]) { Integer b2=128; Integer b3=128; System.out.println(b2==b3); } } เอาท์พุท: false class D { public static void main(String args[]) { Integer b2=127; Integer b3=127; System.out.println(b2==b3); } } เอาท์พุท: true หมายเหตุ: ตัวเลขระหว่าง -128 ถึง 127 เป็นจริง

15
ผ่าน String โดยการอ้างอิงใน Java?
ฉันคุ้นเคยกับการทำสิ่งต่อไปนี้ในC: void main() { String zText = ""; fillString(zText); printf(zText); } void fillString(String zText) { zText += "foo"; } และผลลัพธ์คือ: foo อย่างไรก็ตามใน Java สิ่งนี้ดูเหมือนจะไม่ทำงาน ผมถือว่าเพราะStringวัตถุถูกคัดลอกแทนการส่งผ่านโดยอ้างอิง ฉันคิดว่า Strings เป็นวัตถุซึ่งมักถูกส่งผ่านโดยการอ้างอิง เกิดขึ้นที่นี่คืออะไร?

8
Swift: ส่งอาร์เรย์โดยการอ้างอิง?
ฉันต้องการที่จะผ่านสวิฟท์ของฉันArray account.chatsไปchatsViewController.chatsด้วยการอ้างอิง (เพื่อที่ว่าเมื่อฉันจะเพิ่มการแชทให้account.chats, chatsViewController.chatsยังคงชี้ไปaccount.chats) คือฉันไม่ต้องการให้ Swift แยกอาร์เรย์ทั้งสองเมื่อความยาวของaccount.chatsการเปลี่ยนแปลง

17
ค่าดีฟอลต์ของพารามิเตอร์ขณะส่งผ่านโดยการอ้างอิงใน C ++
เป็นไปได้หรือไม่ที่จะให้ค่าเริ่มต้นแก่พารามิเตอร์ของฟังก์ชันในขณะที่เรากำลังส่งผ่านพารามิเตอร์โดยการอ้างอิง ใน C ++ ตัวอย่างเช่นเมื่อฉันพยายามประกาศฟังก์ชันเช่น: virtual const ULONG Write(ULONG &State = 0, bool sequence = true); เมื่อฉันทำสิ่งนี้จะทำให้เกิดข้อผิดพลาด: ข้อผิดพลาด C2440: 'อาร์กิวเมนต์เริ่มต้น': ไม่สามารถแปลงจาก 'const int' เป็น 'ยาวที่ไม่ได้ลงนาม &' การอ้างอิงที่ไม่เป็น 'const' ไม่สามารถผูกไว้กับค่าที่ไม่ใช่ lvalue

6
วิธีการเทียบเท่า pass by reference สำหรับ primitives ใน Java
รหัส Java นี้: public class XYZ { public static void main(){ int toyNumber = 5; XYZ temp = new XYZ(); temp.play(toyNumber); System.out.println("Toy number in main " + toyNumber); } void play(int toyNumber){ System.out.println("Toy number in play " + toyNumber); toyNumber++; System.out.println("Toy number in play after increement " + toyNumber); } …

17
C ++ - ส่งต่อการอ้างอิงไปยัง std :: shared_ptr หรือ boost :: shared_ptr
ถ้าฉันมีฟังก์ชันที่ต้องทำงานร่วมกับ a shared_ptrมันจะไม่มีประสิทธิภาพมากกว่าที่จะส่งต่อการอ้างอิงไปยังมัน (เพื่อหลีกเลี่ยงการคัดลอกshared_ptrวัตถุ) ผลข้างเคียงที่ไม่ดีที่เป็นไปได้คืออะไร? ฉันนึกภาพสองกรณีที่เป็นไปได้: 1) ภายในฟังก์ชันมีสำเนาของอาร์กิวเมนต์เช่นใน ClassA::take_copy_of_sp(boost::shared_ptr<foo> &sp) { ... m_sp_member=sp; //This will copy the object, incrementing refcount ... } 2) ภายในฟังก์ชันจะใช้อาร์กิวเมนต์เท่านั้นเช่นใน Class::only_work_with_sp(boost::shared_ptr<foo> &sp) //Again, no copy here { ... sp->do_something(); ... } ฉันไม่เห็นเหตุผลที่ดีในทั้งสองกรณีที่จะส่งผ่านboost::shared_ptr<foo>ค่าโดยแทนที่จะเป็นการอ้างอิง การส่งผ่านตามค่าจะเพิ่มจำนวนอ้างอิง "ชั่วคราว" เนื่องจากการคัดลอกและลดลงเมื่อออกจากขอบเขตฟังก์ชัน ฉันมองข้ามบางสิ่งไปหรือเปล่า? เพียงเพื่อชี้แจงหลังจากอ่านคำตอบหลาย ๆ ข้อ: ฉันเห็นด้วยอย่างสมบูรณ์เกี่ยวกับข้อกังวลเกี่ยวกับการปรับให้เหมาะสมก่อนเวลาอันควรและฉันมักจะพยายามสร้างจุดเริ่มต้นจากนั้นทำงานบนฮอตสปอต คำถามของฉันมาจากมุมมองของโค้ดทางเทคนิคล้วนๆถ้าคุณรู้ว่าฉันหมายถึงอะไร

8
รายการที่ส่งผ่านโดย ref - ช่วยฉันอธิบายพฤติกรรมนี้
ดูโปรแกรมต่อไปนี้: class Test { List<int> myList = new List<int>(); public void TestMethod() { myList.Add(100); myList.Add(50); myList.Add(10); ChangeList(myList); foreach (int i in myList) { Console.WriteLine(i); } } private void ChangeList(List<int> myList) { myList.Sort(); List<int> myList2 = new List<int>(); myList2.Add(3); myList2.Add(4); myList = myList2; } } ฉันคิดว่าmyListน่าจะผ่านไปrefแล้วและผลลัพธ์ก็จะ 3 4 รายการนี้ "ส่งผ่านโดย ref" …

8
เป็น Swift Pass By Value หรือ Pass By Reference
ฉันใหม่มากสำหรับ Swift และฉันเพิ่งอ่านว่าคลาสถูกส่งผ่านโดยการอ้างอิงและอาร์เรย์ / สตริง ฯลฯ ถูกคัดลอก pass by reference เป็นแบบเดียวกับใน Objective-C หรือ Java ซึ่งคุณส่งผ่าน "a" reference หรือเปล่าหรือว่า pass by reference ถูกต้อง?

11
การส่งจำนวนเต็มโดยการอ้างอิงใน Python
ฉันจะส่งจำนวนเต็มโดยอ้างอิงใน Python ได้อย่างไร ฉันต้องการแก้ไขค่าของตัวแปรที่ฉันส่งผ่านไปยังฟังก์ชัน ฉันได้อ่านแล้วว่าทุกอย่างใน Python ส่งผ่านค่า แต่ต้องมีเคล็ดลับง่ายๆ ยกตัวอย่างเช่นใน Java คุณสามารถผ่านประเภทอ้างอิงInteger, Longฯลฯ ฉันจะส่งจำนวนเต็มไปยังฟังก์ชันโดยการอ้างอิงได้อย่างไร อะไรคือการปฏิบัติที่ดีที่สุด?

7
Java: วิธีที่ดีที่สุดในการส่งผ่าน int โดยการอ้างอิง
ฉันมีฟังก์ชั่นการแยกวิเคราะห์ที่แยกวิเคราะห์ความยาวที่เข้ารหัสจากบัฟเฟอร์ไบต์มันจะคืนค่าความยาวที่แยกวิเคราะห์เป็น int และรับดัชนีลงในบัฟเฟอร์เป็นจำนวนเต็ม arg ฉันต้องการให้ฟังก์ชันอัปเดตดัชนีตามสิ่งที่แยกวิเคราะห์กล่าวคือต้องการส่งผ่านดัชนีนั้นโดยการอ้างอิง ใน C ฉันจะส่งint *ไฟล์. อะไรคือวิธีที่สะอาดที่สุดในการทำใน Java ฉันกำลังดูการส่งดัชนี arg ในฐานะที่เป็นint[]แต่มันน่าเกลียดไปหน่อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.