คำถามติดแท็ก pointers

ชนิดข้อมูลที่ "ชี้ไปที่" ค่าอื่นเก็บไว้ในหน่วยความจำ ตัวแปรตัวชี้ประกอบด้วยที่อยู่หน่วยความจำของเอนทิตีอื่น ๆ (ตัวแปรหรือฟังก์ชันหรือเอนทิตีอื่น ๆ ) แท็กนี้ควรใช้สำหรับคำถามที่เกี่ยวข้องกับการใช้พอยน์เตอร์ไม่ใช่การอ้างอิง ภาษาโปรแกรมที่ใช้กันทั่วไปโดยใช้พอยน์เตอร์คือภาษา C, C ++, Go และภาษาแอสเซมบลี ใช้แท็กภาษาเฉพาะ แท็กที่เป็นประโยชน์อื่น ๆ คือวิธีการฟังก์ชั่น struct ฯลฯ อธิบายการใช้ตัวชี้


16
ควรใช้การอ้างอิงกับพอยน์เตอร์เมื่อใด
ฉันเข้าใจไวยากรณ์และความหมายทั่วไปของพอยน์เตอร์กับการอ้างอิง แต่ฉันจะตัดสินใจได้อย่างไรว่าควรจะใช้การอ้างอิงหรือพอยน์เตอร์ใน API เหมาะสมกว่าหรือน้อยกว่านั้น โดยปกติแล้วบางสถานการณ์ต้องการหนึ่งหรืออื่น ๆ ( operator++ต้องการอาร์กิวเมนต์อ้างอิง) แต่โดยทั่วไปฉันพบว่าฉันชอบที่จะใช้พอยน์เตอร์ (และพอยน์เตอร์พอยน์) เนื่องจากไวยากรณ์มีความชัดเจนว่าตัวแปรนั้นผ่านการทำลายล้าง เช่นในรหัสต่อไปนี้: void add_one(int& n) { n += 1; } void add_one(int* const n) { *n += 1; } int main() { int a = 0; add_one(a); // Not clear that a may be modified add_one(&a); // 'a' is clearly …
381 c++  pointers  reference 

11
การลบวัตถุใน JavaScript
ฉันสับสนกับdeleteโอเปอเรเตอร์ของ JavaScript รับรหัสต่อไปนี้: var obj = { helloText: "Hello World!" }; var foo = obj; delete obj; หลังจากชิ้นส่วนของรหัสนี้ได้รับการดำเนินการobjเป็นnullแต่ยังหมายถึงวัตถุที่ว่าเหมือนfoo objฉันเดาว่าวัตถุนี้เป็นวัตถุเดียวกับที่fooชี้ไป สับสนนี้เราเพราะเราคาดว่าการเขียนที่delete objถูกลบวัตถุที่ถูกชี้ไปในหน่วยความจำที่ไม่ได้เป็นเพียงตัวแปรobjobj นี่เป็นเพราะ Garbage Collector ของจาวาสคริปต์ทำงานบนการรักษา / ปล่อยดังนั้นถ้าฉันไม่มีตัวแปรอื่น ๆ ที่ชี้ไปที่วัตถุมันจะถูกลบออกจากหน่วยความจำ? (โดยวิธีการทดสอบของฉันเสร็จใน Safari 4)

17
ทำไมต้องใช้พอยน์เตอร์? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ฉันรู้ว่านี่เป็นคำถามพื้นฐานจริง ๆ แต่ฉันเพิ่งเริ่มต้นด้วยการเขียนโปรแกรม C ++ ขั้นพื้นฐานบางอย่างหลังจากเขียนโค้ดโปรเจ็กต์ด้วยภาษาระดับสูง โดยทั่วไปฉันมีสามคำถาม: เหตุใดจึงใช้พอยน์เตอร์แทนตัวแปรปกติ ฉันควรใช้พอยน์เตอร์เมื่อใดและที่ไหน คุณใช้พอยน์เตอร์กับอาร์เรย์ได้อย่างไร
356 c++  c  pointers 

4
ตัวชี้เทียบกับค่าในพารามิเตอร์และค่าส่งคืน
ในการไปมีหลายวิธีในการคืนstructค่าหรือชิ้นส่วนดังกล่าว สำหรับคนที่ฉันเคยเห็น: type MyStruct struct { Val int } func myfunc() MyStruct { return MyStruct{Val: 1} } func myfunc() *MyStruct { return &MyStruct{} } func myfunc(s *MyStruct) { s.Val = 1 } ฉันเข้าใจความแตกต่างระหว่างสิ่งเหล่านี้ ครั้งแรกที่ส่งกลับสำเนาของ struct ตัวชี้ที่สองไปยังค่า struct ที่สร้างขึ้นภายในฟังก์ชั่นที่สามคาดว่าโครงสร้างที่มีอยู่จะถูกส่งผ่านและแทนที่ค่า ฉันเห็นรูปแบบเหล่านี้ทั้งหมดถูกใช้ในบริบทต่าง ๆ ฉันสงสัยว่าแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับสิ่งเหล่านี้คืออะไร คุณจะใช้อันไหน ตัวอย่างเช่นตัวแรกอาจใช้ได้กับโครงสร้างขนาดเล็ก และอันที่สามถ้าคุณต้องการให้หน่วยความจำมีประสิทธิภาพมากเพราะคุณสามารถใช้อินสแตนซ์ struct ระหว่างการโทรได้อย่างง่ายดาย มีวิธีปฏิบัติที่ดีที่สุดสำหรับเมื่อใดที่จะใช้ ในทำนองเดียวกันคำถามเดียวกันเกี่ยวกับชิ้น: func myfunc() …
328 pointers  go 

15
ผ่านอาร์เรย์ 2D ไปยังฟังก์ชัน C ++
ฉันมีฟังก์ชั่นที่ฉันต้องการใช้เป็นตัวแปรอาร์เรย์ขนาดสองมิติ จนถึงตอนนี้ฉันมีสิ่งนี้: void myFunction(double** myArray){ myArray[x][y] = 5; etc... } และฉันได้ประกาศอาร์เรย์ที่อื่นในรหัสของฉัน: double anArray[10][10]; อย่างไรก็ตามการโทรmyFunction(anArray)ทำให้ฉันมีข้อผิดพลาด ฉันไม่ต้องการที่จะคัดลอกอาร์เรย์เมื่อฉันผ่านมันใน. การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นในควรจะปรับเปลี่ยนสถานะของmyFunction anArrayหากฉันเข้าใจอย่างถูกต้องฉันเพียงต้องการส่งผ่านเป็นอาร์กิวเมนต์ตัวชี้ไปยังอาร์เรย์ 2 มิติ ฟังก์ชั่นต้องยอมรับอาร์เรย์ที่มีขนาดต่างกันด้วย ตัวอย่างเช่น, [10][10]และ[5][5]. ฉันจะทำสิ่งนี้ได้อย่างไร

13
วิธีค้นหา 'sizeof' (ตัวชี้ที่ชี้ไปยังอาร์เรย์)
ก่อนอื่นนี่คือรหัสบางส่วน: int main() { int days[] = {1,2,3,4,5}; int *ptr = days; printf("%u\n", sizeof(days)); printf("%u\n", sizeof(ptr)); return 0; } มีวิธีการหาขนาดของอาเรย์ที่ptrชี้ไป (แทนที่จะแค่ให้ขนาดของมันซึ่งเป็นสี่ไบต์บนระบบ 32 บิต)?
309 c  arrays  pointers  sizeof 

11
ความแตกต่างระหว่าง NULL, '\ 0' และ 0 คืออะไร?
ใน C มีปรากฏเป็นความแตกต่างระหว่างค่าต่างๆของศูนย์ - NULL, และNUL0 ฉันรู้ว่าอักขระ ASCII '0'ประเมินหรือ480x30 NULLชี้มักจะถูกกำหนดให้เป็น: #define NULL 0 หรือ #define NULL (void *)0 นอกจากนี้ยังมีNULตัวละคร'\0'ที่ดูเหมือนว่าจะประเมิน0เช่นกัน มีบางครั้งที่ค่าสามค่านี้ไม่สามารถเท่ากันได้หรือไม่? สิ่งนี้เป็นจริงในระบบ 64 บิตหรือไม่
309 c  pointers  null 


9
พอยน์เตอร์ใน C: ควรใช้เครื่องหมายและเครื่องหมายดอกจันเมื่อใด
ฉันเพิ่งเริ่มต้นด้วยตัวชี้และฉันสับสนเล็กน้อย ฉันรู้ว่า&หมายถึงที่อยู่ของตัวแปรและ*สามารถใช้ด้านหน้าของตัวแปรตัวชี้เพื่อรับค่าของวัตถุที่ถูกชี้โดยตัวชี้ แต่สิ่งต่าง ๆ จะทำงานแตกต่างกันเมื่อคุณทำงานกับอาร์เรย์สตริงหรือเมื่อคุณเรียกใช้ฟังก์ชันด้วยสำเนาของตัวแปร เป็นการยากที่จะเห็นรูปแบบของตรรกะภายในทั้งหมดนี้ เมื่อฉันควรใช้&และ*?
298 c  pointers 


11
ฉันควรใช้คำหลักใหม่ใน C ++ เมื่อใด
ฉันใช้ C ++ มาระยะหนึ่งแล้วและฉันก็สงสัยเกี่ยวกับคำหลักใหม่ ฉันควรจะใช้หรือไม่? 1) ด้วยคำหลักใหม่ ... MyClass* myClass = new MyClass(); myClass->MyField = "Hello world!"; 2) ไม่มีคำหลักใหม่ ... MyClass myClass; myClass.MyField = "Hello world!"; จากมุมมองของการใช้งานพวกเขาดูเหมือนจะไม่แตกต่างกัน (แต่ฉันแน่ใจว่าพวกเขาเป็น) ... อย่างไรก็ตามภาษาหลักของฉันคือ C # และแน่นอนวิธีที่ 1 คือสิ่งที่ฉันคุ้นเคย ความยากดูเหมือนจะเป็นวิธีที่ 1 นั้นยากที่จะใช้กับคลาส std C ++ ฉันควรใช้วิธีใด อัปเดต 1: ฉันเพิ่งใช้คำหลักใหม่สำหรับหน่วยความจำฮีป (หรือที่เก็บสินค้าฟรี ) สำหรับอาร์เรย์ขนาดใหญ่ซึ่งอยู่นอกขอบเขต (เช่นถูกส่งคืนจากฟังก์ชัน) เมื่อก่อนที่ฉันใช้กองซ้อนซึ่งทำให้องค์ประกอบครึ่งหนึ่งเสียหายนอกขอบเขตเปลี่ยนเป็นการใช้ฮีปเพื่อให้แน่ใจว่าองค์ประกอบนั้นอยู่ในชั้นเชิง …

17
ทำไมต้องใช้การเปลี่ยนทิศทางแบบคู่ หรือทำไมต้องใช้พอยน์เตอร์กับพอยน์เตอร์?
เมื่อใดควรใช้การเปลี่ยนทิศทางแบบคู่ใน C มีใครอธิบายได้บ้างไหม? สิ่งที่ฉันรู้คือว่าการเบี่ยงเบนสองครั้งเป็นตัวชี้ไปยังตัวชี้ ทำไมฉันต้องใช้ตัวชี้ไปยังตัวชี้?
272 c  pointers 

3
ทำไมโอเปอเรเตอร์ลูกศร (->) ใน C จึงมีอยู่
ตัวดำเนินการ dot ( .) ใช้เพื่อเข้าถึงสมาชิกของ struct ในขณะที่โอเปอเรเตอร์ arrow ( ->) ใน C ใช้เพื่อเข้าถึงสมาชิกของ struct ที่อ้างอิงโดยตัวชี้ที่เป็นปัญหา ตัวชี้ไม่มีสมาชิกใด ๆ ที่สามารถเข้าถึงได้ด้วยตัวดำเนินการ dot (จริง ๆ แล้วเป็นเพียงตัวเลขที่อธิบายตำแหน่งในหน่วยความจำเสมือนดังนั้นจึงไม่มีสมาชิกใด ๆ ) ดังนั้นจะไม่มีความกำกวมหากเราเพิ่งกำหนดตัวดำเนินการจุดเพื่อยกเลิกการลงทะเบียนตัวชี้โดยอัตโนมัติหากมีการใช้งานบนตัวชี้ เหตุใดผู้สร้างภาษาจึงตัดสินใจสร้างสิ่งที่ซับซ้อนมากขึ้นด้วยการเพิ่มโอเปอเรเตอร์ที่ไม่จำเป็น การตัดสินใจออกแบบครั้งใหญ่คืออะไร?
264 c  pointers  dereference 

12
การใช้ตัวดำเนินการลูกศร (->) ใน C
ฉันกำลังอ่านหนังสือที่ชื่อว่า "Teach Yourself C in 21 Days" (ฉันได้เรียนรู้ Java และ C # แล้วดังนั้นฉันจึงเคลื่อนไหวได้เร็วขึ้นมาก) ผมอ่านบทที่เกี่ยวกับตัวชี้และ->(ลูกศร) ประกอบขึ้นมาโดยไม่มีคำอธิบาย ฉันคิดว่ามันถูกใช้เพื่อเรียกสมาชิกและฟังก์ชั่น (เช่นเทียบเท่าของตัวดำเนินการ.(dot) แต่สำหรับตัวชี้แทนสมาชิก) แต่ฉันไม่แน่ใจทั้งหมด ฉันขอคำอธิบายและตัวอย่างโค้ดได้ไหม
257 c  pointers  syntax 

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