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

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

12
ตัวชี้กับการอ้างอิง
สิ่งที่จะเป็นการปฏิบัติที่ดีกว่าเมื่อให้ฟังก์ชันตัวแปรต้นฉบับเพื่อทำงานกับ: unsigned long x = 4; void func1(unsigned long& val) { val = 5; } func1(x); หรือ: void func2(unsigned long* val) { *val = 5; } func2(&x); IOW: มีเหตุผลอะไรไหมที่จะเลือกคนอื่น?


7
วิธีการส่งผ่านวัตถุไปยังฟังก์ชั่นใน C ++?
ฉันใหม่สำหรับการเขียนโปรแกรม C ++ แต่ฉันมีประสบการณ์ใน Java ฉันต้องการคำแนะนำเกี่ยวกับวิธีการส่งวัตถุไปยังฟังก์ชั่นใน C ++ ฉันต้องผ่านพอยน์เตอร์การอ้างอิงหรือค่าที่ไม่ใช่ตัวชี้และไม่อ้างอิงหรือไม่ ฉันจำได้ใน Java ไม่มีปัญหาดังกล่าวเนื่องจากเราส่งเฉพาะตัวแปรที่เก็บการอ้างอิงถึงวัตถุ มันจะดีถ้าคุณสามารถอธิบายได้ว่าจะใช้ตัวเลือกเหล่านั้นด้วยที่ไหน

7
size_t เทียบกับ uintptr_t
มาตรฐาน C รับประกันว่าsize_tเป็นประเภทที่สามารถเก็บดัชนีอาร์เรย์ใด ๆ ซึ่งหมายความว่ามีเหตุผลsize_tควรจะสามารถเก็บตัวชี้ใด ๆ ฉันได้อ่านในเว็บไซต์บางแห่งที่ฉันพบใน Googles ว่าถูกกฎหมายและ / หรือควรทำงาน: void *v = malloc(10); size_t s = (size_t) v; ดังนั้นใน C99 มาตรฐานแนะนำintptr_tและuintptr_tประเภทซึ่งลงนามและไม่ได้ลงนามประเภทรับประกันว่าจะสามารถเก็บพอยน์เตอร์: uintptr_t p = (size_t) v; ดังนั้นความแตกต่างระหว่างการใช้size_tและuintptr_tคืออะไร? ทั้งสองแบบไม่ได้ลงนามและทั้งคู่ควรจะสามารถถือตัวชี้ประเภทใดก็ได้ มีเหตุผลที่น่าสนใจจริง ๆuintptr_tหรือไม่ที่จะใช้(หรือดีกว่า, a void *) มากกว่า a size_t, มากกว่าความชัดเจน? ในโครงสร้างทึบซึ่งเขตข้อมูลจะถูกจัดการโดยฟังก์ชันภายในเท่านั้นมีเหตุผลใดที่จะไม่ทำเช่นนี้หรือไม่? ด้วยโทเค็นเดียวกันptrdiff_tมีชนิดที่มีลายเซ็นสามารถถือความแตกต่างของตัวชี้ได้และดังนั้นจึงสามารถจับตัวชี้ส่วนใหญ่ได้ดังนั้นจึงแตกต่างจากintptr_tอย่างไร ไม่ทุกประเภทเหล่านี้โดยทั่วไปให้บริการฟังก์ชั่นรุ่นเดียวกันที่แตกต่างกันเล็กน้อย? ถ้าไม่ทำไม ฉันไม่สามารถทำอะไรกับหนึ่งในนั้นที่ฉันไม่สามารถทำกับคนอื่นได้? ถ้าเป็นเช่นนั้นเหตุใด C99 จึงเพิ่มประเภทฟุ่มเฟือยสองประเภทลงในภาษา ฉันยินดีที่จะเพิกเฉยต่อพอยน์เตอร์ของฟังก์ชั่นเนื่องจากมันไม่ได้ใช้กับปัญหาปัจจุบัน แต่อย่าลังเลที่จะพูดถึงมันเนื่องจากฉันมีความสงสัยที่ด้อมพวกเขาจะเป็นศูนย์กลางของคำตอบที่ "ถูกต้อง"
246 c  pointers  size-t 

14
ตัวชี้ไปยังคลาสข้อมูลสมาชิก“ :: *”
ฉันเจอข้อมูลโค้ดแปลก ๆ ที่รวบรวมได้ดี: class Car { public: int speed; }; int main() { int Car::*pSpeed = &Car::speed; return 0; } เหตุใด C ++ จึงมีตัวชี้นี้ไปยังสมาชิกข้อมูลที่ไม่คงที่ของคลาส? สิ่งที่การใช้งานของตัวชี้นี้แปลกในรหัสที่แท้จริงคืออะไร?
243 c++  class  pointers  c++-faq 

4
ฉันควรใช้ตัวชี้ประเภทใดเมื่อใด
ตกลงดังนั้นครั้งสุดท้ายที่ฉันเขียน C ++ เพื่อหาเลี้ยงชีพ std::auto_ptrคือ std lib ทั้งหมดที่มีอยู่และboost::shared_ptrเป็นความเดือดดาลทั้งหมด ฉันไม่เคยมองไปที่การเพิ่มประเภทตัวชี้อัจฉริยะอื่น ๆ ฉันเข้าใจว่าตอนนี้ C ++ 11 มีการเพิ่มประเภทบางอย่าง แต่ไม่ใช่ทั้งหมด ดังนั้นใครบางคนจึงมีอัลกอริทึมง่าย ๆ ในการพิจารณาว่าจะใช้ตัวชี้สมาร์ทตัวไหน ควรรวมถึงคำแนะนำเกี่ยวกับพอยน์เตอร์พอยน์เตอร์ (พอยน์เตอร์ดิบเช่นT*) และสมาร์ทพอยน์เตอร์ที่เหลือ (บางอย่างเช่นนี้จะดีมาก)


7
มีประโยชน์ในการผ่านโดยตัวชี้ไปผ่านโดยอ้างอิงใน C ++?
ประโยชน์ของการผ่านโดยตัวชี้ผ่านการอ้างอิงใน C ++ คืออะไร เมื่อเร็ว ๆ นี้ฉันได้เห็นตัวอย่างจำนวนมากที่เลือกการส่งผ่านอาร์กิวเมนต์ของพอยน์เตอร์แทนที่จะส่งผ่านการอ้างอิง มีประโยชน์ในการทำเช่นนี้? ตัวอย่าง: func(SPRITE *x); ด้วยการโทร func(&mySprite); เมื่อเทียบกับ func(SPRITE &x); ด้วยการโทร func(mySprite);

8
ข้อแตกต่างระหว่างอาร์เรย์และตัวชี้ถ่านใน C คืออะไร?
ฉันพยายามทำความเข้าใจพอยน์เตอร์ใน C แต่ตอนนี้ฉันสับสนกับสิ่งต่อไปนี้: char *p = "hello" นี่คือการชี้ตัวชี้ถ่านที่อาร์เรย์ตัวละครเริ่มต้นที่ชั่วโมง char p[] = "hello" นี่คืออาร์เรย์ที่จัดเก็บสวัสดี ความแตกต่างเมื่อฉันส่งตัวแปรทั้งสองไปยังฟังก์ชั่นนี้คืออะไร? void printSomething(char *p) { printf("p: %s",p); }
216 c  arrays  pointers 

17
ส่งคืนอาร์เรย์ในฟังก์ชัน
ฉันมีอาร์เรย์int arr[5]ที่ส่งผ่านไปยังฟังก์ชันfillarr(int arr[]): int fillarr(int arr[]) { for(...); return arr; } ฉันจะคืนค่าอาร์เรย์นั้นได้อย่างไร ฉันจะใช้มันอย่างไรบอกว่าฉันคืนพอยน์เตอร์ให้ฉันจะเข้าถึงได้อย่างไร?

25
ตัวชี้ C คืออะไรถ้าไม่ใช่ที่อยู่หน่วยความจำ
ในแหล่งข้อมูลที่น่าเชื่อถือเกี่ยวกับ C ข้อมูลต่อไปนี้จะได้รับหลังจากพูดคุยกับ&ผู้ดำเนินการ: ... มันค่อนข้างโชคร้ายที่คำศัพท์[ที่อยู่ของ]ยังคงอยู่เพราะมันทำให้คนที่ไม่รู้ว่ากำลังพูดถึงเรื่องอะไรอยู่และทำให้คนที่หลงทางเข้าใจผิด: การคิดถึงพอยน์เตอร์ราวกับว่าพวกเขามักจะนำไปสู่ความเศร้าโศก ... . วัสดุอื่น ๆ ที่ฉันได้อ่าน (จากแหล่งข้อมูลที่น่าเชื่อถือเท่า ๆ กันฉันจะบอกว่า) ได้เรียกตัวชี้และตัว&ดำเนินการให้ที่อยู่หน่วยความจำอย่างไม่สะทกสะท้านเสมอ ฉันชอบที่จะค้นหาความเป็นจริงของเรื่องนี้ต่อไป แต่มันก็เป็นเรื่องยากเมื่อแหล่งข้อมูลที่มีชื่อเสียงไม่เห็นด้วย ตอนนี้ผมกำลังสับสนเล็กน้อย - สิ่งที่ว่าเป็นตัวชี้แล้วหากไม่ได้อยู่หน่วยความจำ? PS ผู้เขียนกล่าวในภายหลังว่า: ... ฉันจะใช้คำว่า 'ที่อยู่' ต่อไปเนื่องจากการคิดค้นคำ [คำศัพท์] ที่ต่างออกไปจะยิ่งแย่กว่าเดิม

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


4
ฉันควรใช้ static_cast หรือ reinterpret_cast เมื่อทำการโมฆะ * ไปยังสิ่งใด
ทั้ง static_cast และ reinterpret_cast ดูเหมือนจะทำงานได้ดีในการคัดเลือกโมฆะ * ไปยังตัวชี้ประเภทอื่น มีเหตุผลที่ดีที่จะสนับสนุนอีกฝ่ายหรือไม่?

3
X ไม่ได้ใช้ Y (…วิธีมีตัวรับสัญญาณตัวชี้) [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 เดือนที่ผ่านมา ปรับปรุงคำถามนี้ มีคำถาม & คำตอบอยู่มากมายในเรื่อง " X ไม่ได้ใช้วิธี Y (... มีตัวรับสัญญาณตัวชี้) " แต่สำหรับฉันพวกเขาดูเหมือนจะพูดถึงสิ่งต่าง ๆ และไม่ได้ใช้กับกรณีเฉพาะของฉัน ดังนั้นแทนที่จะทำคำถามที่เฉพาะเจาะจงฉันทำให้มันกว้างและเป็นนามธรรม - ดูเหมือนว่ามีหลายกรณีที่สามารถทำให้เกิดข้อผิดพลาดนี้ได้ใครบางคนสรุปได้ไหม เช่นวิธีการหลีกเลี่ยงปัญหาและถ้ามันเกิดขึ้นสิ่งที่เป็นไปได้คืออะไร? ขอบคุณ.

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