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

ตัวชี้เป็นชนิดข้อมูลที่ค่าอ้างอิงโดยตรง (หรือ "ชี้ไปที่") ค่าอื่นที่เก็บไว้ที่อื่นในหน่วยความจำคอมพิวเตอร์โดยใช้ที่อยู่

11
ทำไมโมฆะใน C หมายถึงไม่โมฆะ?
ในภาษาที่พิมพ์อย่างรุนแรงเช่น Java และ C #, void(หรือVoid) เป็นชนิดส่งคืนสำหรับวิธีการดูเหมือนจะหมายถึง: วิธีนี้จะไม่ส่งคืนสิ่งใดเลย ไม่มีอะไร ไม่มีการส่งคืน คุณจะไม่ได้รับอะไรจากวิธีนี้ สิ่งที่แปลกจริงๆคือใน C voidเป็นชนิดส่งคืนหรือเป็นชนิดพารามิเตอร์ method หมายความว่า: มันอาจเป็นอะไรก็ได้ คุณต้องอ่านซอร์สโค้ดเพื่อค้นหา โชคดี. หากเป็นตัวชี้คุณควรรู้ว่าคุณกำลังทำอะไรอยู่ ลองพิจารณาตัวอย่างต่อไปนี้ใน C: void describe(void *thing) { Object *obj = thing; printf("%s.\n", obj->description); } void *move(void *location, Direction direction) { void *next = NULL; // logic! return next; } เห็นได้ชัดว่าวิธีที่สองส่งกลับตัวชี้ซึ่งโดยความหมายอาจเป็นอะไรก็ได้ เนื่องจาก …
25 c  pointers 

4
หน่วยความจำของการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดของกิโลไบต์บล็อกและพอยน์เตอร์เป็นไปได้หรือไม่?
นี่เป็นความคิดที่ยากพอที่จะคลุมหัวฉันและฉันจะขอบคุณการแก้ไขใด ๆ / ช่วยให้อ่านได้ง่ายขึ้นสำหรับผู้ที่รู้ ในทางทฤษฎีแล้วมันเป็นไปได้หรือไม่ที่จะมีฮาร์ดไดรฟ์ที่บันทึกไว้บนสำเนาหนึ่งชุดของการเปลี่ยนแปลงไบนารี่ที่เป็นไปได้ทั้งหมดหนึ่งกิโลไบท์แล้วมีส่วนที่เหลือของระบบเพียงแค่สร้างพอยน์เตอร์ไปยังตำแหน่งเหล่านี้ ระบบทำเช่นนี้จะเร็วกว่าแค่เก็บข้อมูลโดยตรงหรือไม่ หากต้องการอธิบายอีกวิธีหนึ่งให้พูดแทนการใช้ประโยค: "สวัสดีฉันชื่อบ็อบ" และ "แซนด์วิชนั้นดูอร่อย" ... เก็บไว้ในฮาร์ดไดรฟ์เราจะมีการเรียงลำดับของตัวอักษรและอักขระอื่น ๆ ไม่เกินจำนวน (พูด 1,000 ตัวอักษรหรือมากกว่านั้น) จากนั้นเก็บประโยคของเราตามที่ต้องการ: [ตัวชี้ # 21381723]

10
ตัวชี้ / การเรียกซ้ำเป็นเรื่องยากอะไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ในอันตรายของโรงเรียนจาวาโจเอลกล่าวถึงประสบการณ์ของเขาที่เพนน์และความยากลำบากของ "การแบ่งส่วนความผิดพลาด" เขาพูดว่า [segfaults นั้นยากจนกระทั่งคุณ] "หายใจลึก ๆ และพยายามบังคับจิตใจของคุณให้ทำงานในระดับนามธรรมที่แตกต่างกันสองระดับพร้อมกัน" จากรายการสาเหตุทั่วไปของsegfaults ฉันไม่เข้าใจว่าเราต้องทำงานในระดับนามธรรมได้อย่างไร ด้วยเหตุผลบางอย่างโจเอลพิจารณาแนวคิดหลักเหล่านี้เป็นความสามารถของโปรแกรมเมอร์ในการสรุป ฉันไม่ต้องการคิดมากเกินไป ดังนั้นอะไรที่เป็นเรื่องยากสำหรับพอยน์เตอร์ / การเรียกซ้ำ? ตัวอย่างจะดี
20 c  pointers  recursion 

4
มีการใช้พอยน์เตอร์ใน C # จริงหรือไม่ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา สถานการณ์ในขณะที่เขียนโค้ดใน C # เมื่อใช้พอยน์เตอร์เป็นตัวเลือกที่ดีหรือจำเป็นคืออะไร ฉันกำลังพูดถึงพอยน์เตอร์ที่ไม่ปลอดภัย
19 c#  pointers 

3
เมื่อใดและทำไมพอยน์เตอร์จึงเริ่มมองว่ามีความเสี่ยง
ดูเหมือนว่ามีการเปลี่ยนแปลงอย่างค่อยเป็นค่อยไปในการคิดเกี่ยวกับการใช้พอยน์เตอร์ในภาษาการเขียนโปรแกรมซึ่งกลายเป็นที่ยอมรับกันโดยทั่วไปว่าพอยน์เตอร์นั้นถือว่ามีความเสี่ยง การพัฒนาทางประวัติศาสตร์อะไรสำหรับการเปลี่ยนแปลงในความคิดนี้ มีเหตุการณ์เฉพาะน้ำเชื้อการวิจัยหรือการพัฒนาอื่น ๆ หรือไม่? ตัวอย่างเช่นการมองเพียงผิวเผินย้อนกลับไปที่การเปลี่ยนจาก C เป็น C ++ เป็น Java ดูเหมือนว่าจะแสดงแนวโน้มที่จะเสริมและแทนที่ตัวชี้ทั้งหมดด้วยการอ้างอิงทั้งหมด อย่างไรก็ตามห่วงโซ่ที่แท้จริงของเหตุการณ์อาจมีความซับซ้อนและซับซ้อนมากกว่านี้และไม่ได้เรียงตามลำดับ คุณสมบัติที่ทำให้เป็นภาษาหลักเหล่านั้นอาจมีต้นกำเนิดที่อื่นอาจนานมาก่อน หมายเหตุ: ฉันไม่ได้ถามเกี่ยวกับประโยชน์ที่แท้จริงของพอยน์เตอร์เทียบกับการอ้างอิงกับสิ่งอื่น ฉันมุ่งเน้นไปที่เหตุผลสำหรับการเปลี่ยนแปลงที่เห็นได้ชัดนี้
18 history  pointers 

4
การกำหนดความสำคัญมาก่อนในตัวชี้ C คืออะไร
ฉันเจอข้อความประกาศสองฉบับที่ฉันมีปัญหาในการทำความเข้าใจ ความเข้าใจของฉันเกี่ยวกับกฎสำคัญกว่ามีดังนี้: Operator Precedence Associativity (), [ ] 1 Left to Right *, identifier 2 Right to Left Data type 3 แต่แม้จะได้รับสิ่งนี้ฉันไม่สามารถหาวิธีประเมินตัวอย่างต่อไปนี้ได้อย่างถูกต้อง: ตัวอย่างแรก float * (* (*ptr)(int))(double **,char c) การประเมินของฉัน: *(ptr) (int) *(*ptr)(int) *(*(*ptr)(int)) จากนั้น double ** char c ตัวอย่างที่สอง unsigned **( * (*ptr) [5] ) (char const *,int *) …
14 c  pointers 

4
ความแตกต่างระหว่างตัวชี้ที่ชี้ไปยังตำแหน่ง 0x0 และตัวชี้ถูกตั้งค่าเป็น NULL คืออะไร
ตัวชี้ชี้ไปที่ 0x0000 เหมือนกับตัวชี้ที่ตั้งค่าเป็น NULL หรือไม่ ถ้าค่า NULL ถูกกำหนดในภาษา C แปลตำแหน่งทางกายภาพเป็นอะไร มันเหมือนกับ 0x0000 ฉันจะหารายละเอียดเพิ่มเติมเกี่ยวกับแนวคิดเหล่านี้ได้ที่ไหน
12 c  pointers  null 


4
การจัดทำดัชนีตัวชี้
ฉันกำลังอ่านหนังสือชื่อ "Numerical Recipes in C" ในหนังสือเล่มนี้ผู้เขียนให้รายละเอียดว่าอัลกอริทึมบางอย่างทำงานได้ดีกว่าโดยธรรมชาติถ้าเรามีดัชนีที่ขึ้นต้นด้วย 1 (ฉันไม่ได้ทำตามอาร์กิวเมนต์ทั้งหมดของเขาและนั่นไม่ใช่จุดของโพสต์นี้) แต่ C จะทำดัชนีอาร์เรย์ของมันเสมอ เพื่อหลีกเลี่ยงสิ่งนี้เขาแนะนำให้ลดทอนพอยน์เตอร์หลังจากการจัดสรรเช่น: float *a = malloc(size); a--; เขาบอกว่าสิ่งนี้จะให้ตัวชี้ที่มีดัชนีเริ่มต้นด้วย 1 อย่างมีประสิทธิภาพซึ่งจะทำให้คุณเป็นอิสระด้วย: free(a + 1); เท่าที่ฉันรู้ว่านี่เป็นพฤติกรรมที่ไม่ได้กำหนดโดยมาตรฐาน C เห็นได้ชัดว่านี่เป็นหนังสือที่มีชื่อเสียงอย่างมากในชุมชน HPC ดังนั้นฉันไม่ต้องการเพียงแค่เพิกเฉยต่อสิ่งที่เขาพูด แต่เพียงการลดตัวชี้นอกช่วงที่จัดสรรนั้น นี่เป็นพฤติกรรม "อนุญาต" ใน C หรือไม่ ฉันได้ทำการทดสอบโดยใช้ทั้ง gcc และ icc และผลลัพธ์ทั้งสองนั้นปรากฏขึ้นเพื่อระบุว่าฉันไม่ต้องกังวลอะไร แต่ฉันต้องการที่จะเป็นบวกอย่างแน่นอน
11 c  pointers 

8
การใช้ตัวชี้และข้อดีของพอยน์เตอร์คืออะไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันมักจะดิ้นรนเพื่อดูข้อดีของพอยน์เตอร์ (ยกเว้นการเขียนโปรแกรมระดับต่ำ) เหตุใดจึงใช้ถ่าน * แทนที่จะเป็นสตริงหรือถ่าน [] หรือเลขคณิตของตัวชี้ข้อดีคืออะไร ดังนั้นข้อดีและการใช้งานของพอยน์เตอร์คืออะไร
10 pointers 

2
วิธีที่เหมาะสมในการลบรายการออกจากรายการที่เชื่อมโยง
ในการสัมภาษณ์ Slashdot Linus Torvalds อ้างว่า: ฉันเห็นคนจำนวนมากเกินไปที่ลบรายการที่ลิงก์แบบเอกเทศโดยติดตามรายการ "ก่อนหน้า" จากนั้นลบรายการทำสิ่งที่ชอบ ถ้า (prev) prev-> next = entry-> next; else list_head = entry-> ถัดไป; และเมื่อใดก็ตามที่ฉันเห็นรหัสเช่นนั้นฉันเพิ่งไป "คนนี้ไม่เข้าใจตัวชี้" และเป็นเรื่องธรรมดาที่ค่อนข้างเศร้า ผู้ที่เข้าใจพอยน์เตอร์เพียงใช้ "ตัวชี้ไปยังตัวชี้รายการ" และเริ่มต้นด้วยที่อยู่ของ list_head และเมื่อพวกเขาเข้าไปในรายการพวกเขาสามารถลบรายการโดยไม่ต้องใช้เงื่อนไขใด ๆ เพียงแค่ทำ "* pp = entry-> next" ในฐานะนักพัฒนา PHP ฉันไม่ได้สัมผัสพอยน์เตอร์ตั้งแต่รู้เบื้องต้นเกี่ยวกับ Cในมหาวิทยาลัยเมื่อสิบปีก่อน อย่างไรก็ตามฉันรู้สึกว่านี่เป็นสถานการณ์ประเภทที่ฉันควรทำความคุ้นเคยเป็นอย่างน้อย Linus กำลังพูดถึงอะไร ความจริงแล้วถ้าฉันถูกขอให้นำลิสต์ที่เชื่อมโยงและนำไอเท็มออกวิธีที่ 'ผิด' ข้างต้นเป็นวิธีที่ฉันจะทำ ฉันต้องรู้อะไรบ้างในการเขียนโปรแกรมเนื่องจาก Linus บอกว่าดีที่สุด ฉันถามที่นี่มากกว่า Stack …
10 pointers 

1
การพัฒนาที่เก็บคีย์ / ค่าที่ย้ายไปยัง C ++ ที่ทันสมัย
ฉันกำลังพัฒนาเซิร์ฟเวอร์ฐานข้อมูลที่คล้ายกับ Cassandra การพัฒนาเริ่มต้นใน C แต่สิ่งต่าง ๆ ก็ซับซ้อนมากโดยไม่ต้องเรียน ขณะนี้ฉันได้ย้ายทุกอย่างใน C ++ 11 แต่ฉันยังคงเรียนรู้ C ++ ที่ทันสมัยและยังมีข้อสงสัยมากมาย ฐานข้อมูลจะทำงานกับคู่ของคีย์ / ค่า ทุกคู่มีข้อมูลเพิ่มเติม - เมื่อถูกสร้างขึ้นด้วยเมื่อมันจะหมดอายุ (0 ถ้าไม่หมดอายุ) แต่ละคู่นั้นไม่เปลี่ยนรูป Key คือสตริง C ค่าเป็นโมฆะ * แต่อย่างน้อยตอนนี้ฉันทำงานด้วยค่าเป็นสตริง C เช่นกัน มีIListระดับนามธรรม มันสืบทอดมาจากสามชั้น VectorList - C dynamic array - คล้ายกับ std :: vector แต่ใช้ realloc LinkList - ทำเพื่อการตรวจสอบและเปรียบเทียบประสิทธิภาพ SkipList …

4
คุณได้จัดส่งคุณจะได้รับข้อผิดพลาด seg ที่หายาก การตรวจสอบตัวชี้หรือปล่อยมันไป?
คุณได้ส่งการยืนยันถูกปิดคุณจะได้รับรายงานข้อผิดพลาดที่หายากซึ่งระบุว่ามีการละเมิดตัวชี้โมฆะในรหัสของคุณ ในสภาพแวดล้อมการพัฒนาปัญหาจะได้รับการยืนยันโดยยืนยัน สิ่งที่คุณมีคือรายงานข้อขัดข้องดังนั้นการทำซ้ำปัญหาจึงเป็นไปไม่ได้ การติดตามย้อนกลับไม่ได้ให้เบาะแสใด ๆ ว่าทำไมความผิดพลาดจึงเกิดขึ้นตั้งแต่แรก ตัวเลือก: - เพิ่มการตรวจสอบตัวชี้เพื่อป้องกันความผิดพลาด วิธีนี้จะช่วยป้องกันความผิดพลาด แต่คุณอาจไม่ทราบด้วยซ้ำว่าทำไมจึงเกิดขึ้นตั้งแต่แรก - ปล่อยให้มันบินไปหวังว่ามันจะเกิดขึ้นอีกครั้งด้วยสถานการณ์จำลอง สมมติว่าแอปพลิเคชันไม่ได้มีไว้สำหรับขีปนาวุธนำทางหรือระบบเบรกอัตโนมัติ ... คุณจะเลือกแบบไหน
9 bug  pointers 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.