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

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


11
เหตุใดรายการที่เชื่อมโยงจึงใช้พอยน์เตอร์แทนการจัดเก็บโหนดภายในโหนด
ฉันเคยทำงานกับรายการที่เชื่อมโยงมาก่อนใน Java แต่ฉันยังใหม่กับ C ++ มาก ฉันใช้คลาสโหนดนี้ที่มอบให้ฉันในโปรเจ็กต์ได้ดี class Node { public: Node(int data); int m_data; Node *m_next; }; แต่ฉันมีคำถามหนึ่งที่ตอบไม่ดีนัก ทำไมจึงต้องใช้ Node *m_next; เพื่อชี้ไปที่โหนดถัดไปในรายการแทนที่จะเป็น Node m_next; ฉันเข้าใจว่าควรใช้เวอร์ชันตัวชี้จะดีกว่า ฉันจะไม่เถียงข้อเท็จจริง แต่ไม่รู้ว่าทำไมมันดีกว่า ฉันได้รับคำตอบที่ไม่ชัดเจนนักว่าตัวชี้นั้นดีกว่าสำหรับการจัดสรรหน่วยความจำอย่างไรและฉันก็สงสัยว่าใครที่นี่จะช่วยให้ฉันเข้าใจสิ่งนั้นได้ดีขึ้น

21
เหตุใดจึงใช้ศูนย์ที่อยู่สำหรับตัวชี้ค่าว่าง
ใน C (หรือ C ++ สำหรับเรื่องนั้น) พอยน์เตอร์มีความพิเศษหากมีค่าเป็นศูนย์: ฉันขอแนะนำให้ตั้งค่าพอยน์เตอร์เป็นศูนย์หลังจากปลดปล่อยหน่วยความจำเพราะหมายความว่าการปล่อยพอยน์เตอร์อีกครั้งจะไม่เป็นอันตราย เมื่อฉันเรียก malloc มันจะส่งคืนตัวชี้ที่มีค่าเป็นศูนย์หากไม่สามารถรับหน่วยความจำได้ ฉันใช้if (p != 0)เวลาทั้งหมดเพื่อให้แน่ใจว่าพอยน์เตอร์ที่ผ่านนั้นถูกต้อง ฯลฯ แต่เนื่องจากการกำหนดแอดเดรสหน่วยความจำเริ่มต้นที่ 0 จึงไม่ใช่ที่อยู่ที่ถูกต้องเหมือนที่อยู่อื่น ๆ ใช่หรือไม่? 0 จะใช้ในการจัดการตัวชี้ค่าว่างได้อย่างไรหากเป็นเช่นนั้น เหตุใดจำนวนลบจึงไม่เป็นค่าว่างแทน แก้ไข: คำตอบที่ดีมากมาย ฉันจะสรุปสิ่งที่พูดในคำตอบที่แสดงในขณะที่ใจของฉันตีความมันและหวังว่าชุมชนจะแก้ไขฉันหากฉันเข้าใจผิด เช่นเดียวกับสิ่งอื่น ๆ ในการเขียนโปรแกรมมันเป็นนามธรรม เพียงแค่คงไม่เกี่ยวข้องจริงๆที่จะอยู่ 0. C ++ 0x nullptrเน้นนี้โดยการเพิ่มคำหลัก มันไม่ได้เป็นนามธรรมที่อยู่ แต่เป็นค่าคงที่ที่กำหนดโดยมาตรฐาน C และคอมไพเลอร์สามารถแปลเป็นจำนวนอื่นได้ตราบเท่าที่ตรวจสอบให้แน่ใจว่าจะไม่เท่ากับที่อยู่ "จริง" และเท่ากับพอยน์เตอร์ว่างอื่น ๆ หาก 0 ไม่ใช่ คุ้มค่าที่สุดที่จะใช้สำหรับแพลตฟอร์ม ในกรณีที่ไม่ใช่สิ่งที่เป็นนามธรรมซึ่งในช่วงแรก ๆ ระบบจะใช้แอดเดรส …
121 c++  c  memory  pointers 


10
สร้างตัวชี้ไปยังอาร์เรย์สองมิติ
ฉันต้องการตัวชี้ไปยังอาร์เรย์ 2 มิติแบบคงที่ วิธีนี้ทำได้อย่างไร? static uint8_t l_matrix[10][20]; void test(){ uint8_t **matrix_ptr = l_matrix; //wrong idea } ฉันได้รับข้อผิดพลาดทุกประเภทเช่น: คำเตือน: การกำหนดจากประเภทตัวชี้ที่เข้ากันไม่ได้ ค่าตัวห้อยไม่ใช่อาร์เรย์หรือตัวชี้ ข้อผิดพลาด: การใช้สมาชิกอาร์เรย์แบบยืดหยุ่นไม่ถูกต้อง
120 c  arrays  pointers 

9
ตัวชี้ C: ชี้ไปยังอาร์เรย์ที่มีขนาดคงที่
คำถามนี้ออกไปยังผู้เชี่ยวชาญด้าน C ที่นั่น: ใน C สามารถประกาศตัวชี้ได้ดังนี้: char (* p)[10]; .. ซึ่งโดยพื้นฐานแล้วระบุว่าตัวชี้นี้ชี้ไปที่อาร์เรย์ 10 ตัวอักษร สิ่งที่เรียบร้อยเกี่ยวกับการประกาศตัวชี้เช่นนี้คือคุณจะได้รับข้อผิดพลาดเวลาคอมไพล์หากคุณพยายามกำหนดตัวชี้ของอาร์เรย์ที่มีขนาดต่างกันให้กับ p นอกจากนี้ยังจะทำให้คุณมีข้อผิดพลาดเวลาคอมไพล์หากคุณพยายามกำหนดค่าของตัวชี้ถ่านให้กับ p ฉันลองใช้ gcc และดูเหมือนว่าจะใช้ได้กับ ANSI, C89 และ C99 สำหรับฉันแล้วดูเหมือนว่าการประกาศตัวชี้แบบนี้จะมีประโยชน์มากโดยเฉพาะอย่างยิ่งเมื่อส่งตัวชี้ไปยังฟังก์ชัน โดยปกติผู้คนจะเขียนต้นแบบของฟังก์ชันเช่นนี้: void foo(char * p, int plen); หากคุณคาดหวังว่าจะมีบัฟเฟอร์ที่มีขนาดเฉพาะคุณก็แค่ทดสอบค่าของ plen อย่างไรก็ตามคุณไม่สามารถรับประกันได้ว่าบุคคลที่ส่ง p ถึงคุณจะให้ตำแหน่งหน่วยความจำที่ถูกต้องในบัฟเฟอร์นั้น คุณต้องเชื่อมั่นว่าบุคคลที่เรียกว่าฟังก์ชันนี้ทำในสิ่งที่ถูกต้อง ในทางกลับกัน: void foo(char (*p)[10]); .. จะบังคับให้ผู้โทรให้บัฟเฟอร์ตามขนาดที่กำหนด ดูเหมือนว่ามีประโยชน์มาก แต่ฉันไม่เคยเห็นตัวชี้ที่ประกาศแบบนี้ในรหัสใด ๆ ที่ฉันเคยพบ คำถามของฉันคือมีเหตุผลใดบ้างที่คนไม่ประกาศคำชี้เช่นนี้? ฉันไม่เห็นข้อผิดพลาดที่ชัดเจนหรือไม่?
120 c  pointers  size 

15
เหตุใดพอยน์เตอร์จึงไม่เริ่มต้นด้วย NULL ตามค่าเริ่มต้น
ใครช่วยอธิบายได้NULLไหมว่าทำไมพอยน์เตอร์ถึงไม่เริ่มต้น ตัวอย่าง: void test(){ char *buf; if (!buf) // whatever } โปรแกรมจะไม่เข้าไปใน if เพราะbufไม่ใช่โมฆะ ฉันต้องการทราบว่าเหตุใดเราจึงต้องมีตัวแปรที่มีถังขยะอยู่ในกรณีใดตัวชี้พิเศษที่ระบุถึงถังขยะในหน่วยความจำ

2
“ <type> เป็นตัวชี้ไปที่อินเทอร์เฟซไม่ใช่อินเทอร์เฟซ” เกิดความสับสน
เรียนเพื่อนนักพัฒนา ฉันมีปัญหานี้ซึ่งดูเหมือนจะแปลกสำหรับฉัน ดูตัวอย่างโค้ดนี้: package coreinterfaces type FilterInterface interface { Filter(s *string) bool } type FieldFilter struct { Key string Val string } func (ff *FieldFilter) Filter(s *string) bool { // Some code } type FilterMapInterface interface { AddFilter(f *FilterInterface) uuid.UUID RemoveFilter(i uuid.UUID) GetFilterByID(i uuid.UUID) *FilterInterface } type FilterMap struct { …
117 pointers  go  interface 

2
ฉันจะทำลิเทอรัล * int64 ใน Go ได้อย่างไร
ฉันมีประเภทโครงสร้างที่มี*int64ฟิลด์ type SomeType struct { SomeField *int64 } เมื่อถึงจุดหนึ่งในรหัสของฉันฉันต้องการประกาศตัวอักษรของสิ่งนี้ (เช่นเมื่อฉันรู้ว่าค่าควรเป็น 0 หรือชี้ไปที่ 0 คุณก็รู้ว่าฉันหมายถึงอะไร) instance := SomeType{ SomeField: &amp;0, } ... ยกเว้นไม่ได้ผล ./main.go:xx: cannot use &amp;0 (type *int) as type *int64 in field value ก็เลยลองทำตามนี้ instance := SomeType{ SomeField: &amp;int64(0), } ... แต่ก็ไม่ได้ผลเช่นกัน ./main.go:xx: cannot take the address of int64(0) …
116 pointers  go  struct  literals 


14
ฉันจะใช้พอยน์เตอร์ใน Java ได้อย่างไร
ฉันรู้ว่า Java ไม่มีพอยน์เตอร์ แต่ฉันได้ยินมาว่าโปรแกรม Java สามารถสร้างได้ด้วยพอยน์เตอร์และสิ่งนี้สามารถทำได้โดยไม่กี่คนที่เป็นผู้เชี่ยวชาญใน java มันจริงหรอ?
112 java  pointers  unsafe 

10
ฟรี (ptr) ที่ ptr เป็นหน่วยความจำ NULL เสียหายหรือไม่
ในทางทฤษฎีฉันสามารถพูดได้ว่า free(ptr); free(ptr); เป็นความเสียหายของหน่วยความจำเนื่องจากเรากำลังปลดปล่อยหน่วยความจำที่ได้รับการปลดปล่อยไปแล้ว แต่ถ้า free(ptr); ptr=NULL; free(ptr); เนื่องจากระบบปฏิบัติการจะทำงานในลักษณะที่ไม่ได้กำหนดฉันจึงไม่สามารถรับการวิเคราะห์ทางทฤษฎีที่แท้จริงเกี่ยวกับสิ่งที่เกิดขึ้นได้ ไม่ว่าฉันกำลังทำอะไรอยู่นี้หน่วยความจำเสียหายหรือไม่? การพ้นตัวชี้ NULL ถูกต้องหรือไม่?

3
เหตุใดโค้ดนี้จึง segfault บนสถาปัตยกรรม 64 บิต แต่ทำงานได้ดีบน 32 บิต
ฉันเจอปริศนา C ต่อไปนี้: ถาม: เหตุใดโปรแกรมต่อไปนี้จึง segfault บน IA-64 แต่ทำงานได้ดีบน IA-32 int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; } ฉันรู้ว่าขนาดของintบนเครื่อง 64 บิตอาจไม่เหมือนกับขนาดของตัวชี้ ( intอาจเป็น 32 บิตและตัวชี้อาจเป็น 64 บิต) แต่ฉันไม่แน่ใจว่าสิ่งนี้เกี่ยวข้องกับโปรแกรมข้างต้นอย่างไร ความคิดใด ๆ ?

2
ตัวรับค่าเทียบกับตัวรับตัวชี้
มันไม่ชัดเจนมากสำหรับฉันในกรณีนี้ฉันต้องการใช้ตัวรับค่าแทนการใช้ตัวรับตัวชี้เสมอ สรุปจากเอกสาร: type T struct { a int } func (tv T) Mv(a int) int { return 0 } // value receiver func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver เอกสารกล่าวว่านอกจากนี้ยังมี "สำหรับประเภทเช่นประเภทพื้นฐานชิ้นและ structs ขนาดเล็กรับคุ้มค่าราคาถูกมากดังนั้นถ้าความหมายของวิธีการที่ต้องใช้ตัวชี้รับค่ามีประสิทธิภาพและชัดเจน." จุดแรกบอกว่า "ถูกมาก" แต่คำถามคือถูกกว่าแล้วตัวรับสัญญาณ ดังนั้นฉันจึงสร้างเกณฑ์มาตรฐานขนาดเล็ก(รหัสในส่วนสำคัญ)ซึ่งแสดงให้ฉันเห็นว่าตัวรับตัวชี้นั้นเร็วกว่าแม้ในโครงสร้างที่มีฟิลด์สตริงเพียงช่องเดียว นี่คือผลลัพธ์: // Struct one empty string property …
112 function  pointers  go 

6
อะไรทำให้การใช้พอยน์เตอร์นี้ไม่สามารถคาดเดาได้?
ขณะนี้ฉันกำลังเรียนรู้คำแนะนำและอาจารย์ของฉันให้ตัวอย่างโค้ดชิ้นนี้: //We cannot predict the behavior of this program! #include &lt;iostream&gt; using namespace std; int main() { char * s = "My String"; char s2[] = {'a', 'b', 'c', '\0'}; cout &lt;&lt; s2 &lt;&lt; endl; return 0; } เขาเขียนในความคิดเห็นว่าเราไม่สามารถคาดเดาพฤติกรรมของโปรแกรมได้ อะไรทำให้คาดเดาไม่ได้กันแน่? ฉันไม่เห็นอะไรผิดปกติกับมัน
108 c++  pointers 

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