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

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

5
ตัวระบุรูปแบบที่ถูกต้องเพื่อพิมพ์ตัวชี้หรือที่อยู่?
ฉันควรใช้ตัวระบุรูปแบบใดเพื่อพิมพ์ที่อยู่ของตัวแปร ฉันสับสนระหว่างล็อตด้านล่าง % u - จำนวนเต็มไม่ได้ลงนาม % x - ค่าเลขฐานสิบหก % p - ตัวชี้โมฆะ รูปแบบใดที่เหมาะสมที่สุดในการพิมพ์ที่อยู่

6
ที่อยู่ของอาร์เรย์นั้นมีค่าเท่ากับมูลค่าใน C อย่างไร
ในรหัสต่อไปนี้ค่าของตัวชี้และที่อยู่ของตัวชี้จะแตกต่างกันตามที่คาดไว้ แต่ค่าและที่อยู่ของอาร์เรย์ไม่ได้! สิ่งนี้จะเป็นอย่างไร เอาท์พุต my_array = 0022FF00 &my_array = 0022FF00 pointer_to_array = 0022FF00 &pointer_to_array = 0022FEFC #include <stdio.h> int main() { char my_array[100] = "some cool string"; printf("my_array = %p\n", my_array); printf("&my_array = %p\n", &my_array); char *pointer_to_array = my_array; printf("pointer_to_array = %p\n", pointer_to_array); printf("&pointer_to_array = %p\n", &pointer_to_array); printf("Press ENTER to …
189 c  pointers  arrays 

13
C ไม่ใช่เรื่องยาก: void (* (* f []) ()) ()
ฉันเพิ่งเห็นภาพวันนี้และคิดว่าฉันชอบคำอธิบาย ดังนั้นนี่คือภาพ: ฉันพบว่ามันสับสนและสงสัยว่ารหัสดังกล่าวเป็นประโยชน์ ฉันไปที่รูปภาพและพบรูปภาพอื่นในรายการ reddit นี้และนี่คือรูปภาพนั้น: ดังนั้น "การอ่านแบบวน" นี้เป็นสิ่งที่ถูกต้อง? นี่เป็นวิธีคอมไพเลอร์ของ C หรือไม่? มันคงจะดีถ้ามีคำอธิบายที่ง่ายกว่าสำหรับโค้ดแปลก ๆ นี้ นอกจากรหัสประเภทนี้จะมีประโยชน์หรือไม่ ถ้าเป็นเช่นนั้นที่ไหนและเมื่อไหร่? มีคำถามเกี่ยวกับ "กฎส่วนก้นหอย" แต่ฉันไม่เพียงแค่ถามว่ามันถูกนำไปใช้อย่างไรหรือวิธีการอ่านนิพจน์ที่มีกฎนั้น ฉันกำลังถามถึงการใช้ความถูกต้องของนิพจน์และกฎของเกลียวเช่นกัน เกี่ยวกับสิ่งเหล่านี้คำตอบที่ดีมีการโพสต์แล้ว

13
ทำไมเครื่องหมายดอกจันอยู่ข้างหน้าชื่อตัวแปรแทนที่จะเป็นประเภทหลัง
ทำไมตัวแปรชื่อโปรแกรมเมอร์ซีส่วนใหญ่เช่นนี้: int *myVariable; มากกว่าเช่นนี้ int* myVariable; ทั้งสองถูกต้อง ดูเหมือนว่าฉันว่าเครื่องหมายดอกจันเป็นส่วนหนึ่งของประเภทไม่ใช่ส่วนหนึ่งของชื่อตัวแปร ใครสามารถอธิบายเหตุผลนี้

2
เหตุใดตัวชี้ 'this' จึงไม่ใช่ตัวอ้างอิง
ฉันกำลังอ่านคำตอบสำหรับคำถามนี้ข้อดีและข้อเสีย C ++และมีข้อสงสัยนี้ในขณะที่อ่านความคิดเห็น โปรแกรมเมอร์มักพบว่าสับสนว่า "นี่" เป็นตัวชี้ แต่ไม่ใช่การอ้างอิง ความสับสนอีกอย่างคือทำไม "hello" ไม่ใช่ type std :: string แต่ประเมินเป็น char const * (ตัวชี้) (หลังจากการแปลงอาเรย์เป็นตัวชี้) - Johannes Schaub - litb 22 ธันวาคม 2008 เวลา 1:56 นั่นแสดงให้เห็นว่ามันไม่ได้ใช้แบบแผนเดียวกับภาษาอื่น ๆ (ในภายหลัง) - เลอ dorfier 22 ธันวาคม '08 ที่ 3:35 ฉันจะเรียกสิ่งนี้ว่า "ปัญหาเล็กน้อย" และอุ๊ปส์ขอบคุณสำหรับการจับข้อผิดพลาดเล็กน้อยในตัวอย่างของพฤติกรรมที่ไม่ได้กำหนด :) ถึงแม้ว่าฉันไม่เข้าใจว่าข้อมูลเกี่ยวกับขนาดเกี่ยวข้องกับอะไรในข้อมูลแรก ตัวชี้ไม่ได้รับอนุญาตให้ชี้ออกไปนอกหน่วยความจำที่จัดสรร - วันที่ 22 …


8
เลขคณิตของตัวชี้สำหรับตัวชี้โมฆะใน C
เมื่อมีการชี้ไปยังประเภทใดประเภทหนึ่ง (พูดint, char, float, .. ) จะเพิ่มขึ้นค่าของมันจะเพิ่มขึ้นตามขนาดของชนิดข้อมูลว่า หากvoidตัวชี้ที่ชี้ไปยังข้อมูลขนาดxเพิ่มขึ้นมันจะไปยังจุดxไบต์ข้างหน้าได้อย่างไร คอมไพเลอร์รู้ได้อย่างไรว่าจะเพิ่มxมูลค่าของตัวชี้?

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


6
ใน C เหตุใดบางคนเหวี่ยงตัวชี้ก่อนที่จะปล่อย
ฉันกำลังทำงานกับฐานรหัสเก่าและทุก ๆ การเรียกใช้ฟรี () ใช้การส่งผ่านการโต้แย้ง ตัวอย่างเช่น, free((float *)velocity); free((float *)acceleration); free((char *)label); โดยที่ตัวชี้แต่ละตัวเป็นประเภทที่ตรงกัน (และการจับคู่) ฉันไม่เห็นจุดที่จะทำสิ่งนี้เลย มันเป็นรหัสเก่ามากดังนั้นฉันจึงสงสัยว่ามันจะเป็นของ K&R หรือเปล่า ถ้าเป็นเช่นนั้นฉันต้องการสนับสนุนคอมไพเลอร์ตัวเก่าที่อาจจำเป็นต้องใช้ดังนั้นฉันจึงไม่ต้องการลบออก มีเหตุผลทางเทคนิคในการใช้การปลดเปลื้องเหล่านี้หรือไม่ ฉันไม่เห็นเหตุผลที่ใช้ประโยชน์ได้มากนัก อะไรคือจุดที่ทำให้เรานึกถึงประเภทข้อมูลที่ถูกต้องก่อนที่จะทำให้เป็นอิสระ แก้ไข: คำถามนี้ไม่ได้ซ้ำกับคำถามอื่น คำถามอื่นเป็นกรณีพิเศษของคำถามนี้ซึ่งฉันคิดว่าชัดเจนว่าผู้มีสิทธิเลือกตั้งอย่างใกล้ชิดจะอ่านคำตอบทั้งหมดหรือไม่ Colophon: ฉันจะให้เครื่องหมายถูก "ตอบ const" เพราะมันเป็นเหตุผลที่แท้จริงที่ทำให้ต้องมีเหตุผลที่แท้จริงว่าทำไมต้องทำสิ่งนี้ อย่างไรก็ตามคำตอบเกี่ยวกับการเป็น pre-ANSI C ที่กำหนดเอง (อย่างน้อยในบรรดาโปรแกรมเมอร์) ดูเหมือนจะเป็นเหตุผลที่ใช้ในกรณีของฉัน จุดที่ดีมากมายจากคนมากมายที่นี่ ขอบคุณสำหรับการสนับสนุนของคุณ
167 c  pointers  casting 

10
ฉันควรเก็บวัตถุทั้งหมดหรือตัวชี้ไปยังวัตถุในภาชนะบรรจุหรือไม่
การออกแบบระบบใหม่ตั้งแต่เริ่มต้น ฉันจะใช้ STL เพื่อจัดเก็บรายการและแผนที่ของวัตถุระยะยาว คำถาม: ฉันควรให้แน่ใจว่าวัตถุของฉันมีตัวสร้างสำเนาและจัดเก็บสำเนาของวัตถุภายในคอนเทนเนอร์ STL ของฉันหรือโดยทั่วไปจะดีกว่าที่จะจัดการชีวิต & ขอบเขตตัวเองและเพียงแค่เก็บพอยน์เตอร์ไปยังวัตถุเหล่านั้นในคอนเทนเนอร์ STL ของฉัน ฉันรู้ว่านี่เป็นรายละเอียดที่ค่อนข้างสั้น แต่ฉันกำลังมองหาคำตอบที่ดีกว่า "เชิงทฤษฎี" ถ้ามีอยู่เนื่องจากฉันรู้ว่าทั้งสองวิธีนี้เป็นไปได้ ข้อเสียที่ชัดเจนมากสองอย่างในการเล่นกับพอยน์เตอร์: 1) ฉันต้องจัดการการจัดสรร / การจัดสรรคืนของวัตถุเหล่านี้ด้วยตัวเองในขอบเขตที่นอกเหนือจาก STL 2) ฉันไม่สามารถสร้างวัตถุชั่วคราวในสแต็กและเพิ่มลงในคอนเทนเนอร์ของฉัน มีอะไรอีกบ้างที่ฉันขาดไป?
162 c++  stl  pointers 

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

8
กลับอาร์เรย์โดยใช้ C
ฉันค่อนข้างใหม่กับ C และฉันต้องการความช่วยเหลือเกี่ยวกับวิธีการจัดการกับอาร์เรย์ มาจากการเขียนโปรแกรม Java ฉันคุ้นเคยกับความสามารถในการพูดint [] method()เพื่อส่งกลับอาร์เรย์ อย่างไรก็ตามฉันพบว่าด้วย C คุณต้องใช้พอยน์เตอร์สำหรับอาร์เรย์เมื่อคุณส่งคืน ในฐานะโปรแกรมเมอร์คนใหม่ฉันไม่เข้าใจเลยแม้แต่เรื่องที่ฉันได้ดูมา โดยทั่วไปฉันพยายามเขียนวิธีที่ส่งกลับอาร์เรย์ char ใน C. ฉันจะให้วิธีการ (ให้เรียกมันว่า returnArray) กับอาร์เรย์ มันจะสร้างอาร์เรย์ใหม่จากอาร์เรย์ก่อนหน้าและส่งกลับตัวชี้ไปยังมัน ฉันแค่ต้องการความช่วยเหลือเกี่ยวกับวิธีการเริ่มต้นนี้และวิธีการอ่านตัวชี้เมื่อมันถูกส่งออกจากอาร์เรย์ ความช่วยเหลือใด ๆ ที่อธิบายสิ่งนี้ยินดี รูปแบบรหัสที่เสนอสำหรับฟังก์ชันส่งคืนอาร์เรย์ char *returnArray(char array []){ char returned [10]; //methods to pull values from array, interpret them, and then create new array return &(returned[0]); //is this …
153 c  arrays  pointers  char 

18
เป็นวิธีที่ดีในการ NULL ตัวชี้หลังจากลบหรือไม่
ฉันจะเริ่มต้นด้วยการพูด ใช้ตัวชี้สมาร์ทและคุณจะไม่ต้องกังวลเกี่ยวกับเรื่องนี้ รหัสต่อไปนี้มีปัญหาอะไร? Foo * p = new Foo; // (use p) delete p; p = NULL; นี่เป็นจุดประกายโดยคำตอบและแสดงความคิดเห็นต่อคำถามอื่น หนึ่งความคิดเห็นจากNeil Butterworthสร้าง upvotes ไม่กี่: การตั้งค่าพอยน์เตอร์เป็น NULL หลังการลบไม่ใช่แนวปฏิบัติสากลที่ดีใน C ++ มีหลายครั้งที่มันเป็นเรื่องดีที่ต้องทำและบางครั้งเมื่อมันไม่มีจุดหมายและสามารถซ่อนข้อผิดพลาดได้ มีสถานการณ์มากมายที่ไม่สามารถช่วยได้ แต่จากประสบการณ์ของฉันมันไม่สามารถทำร้ายได้ ใครบางคนสอนฉัน

12
ทำไม x [0]! = x [0] [0]! = x [0] [0] [0]
ฉันกำลังศึกษา C ++ เพียงเล็กน้อยและฉันกำลังต่อสู้กับพอยน์เตอร์ ฉันเข้าใจว่าฉันสามารถมีพอยน์เตอร์ได้ 3 ระดับโดยการประกาศ: int *(*x)[5]; เพื่อให้*xเป็นตัวชี้ไปยังอาร์เรย์ของ 5 intองค์ประกอบที่เป็นตัวชี้ไปยัง นอกจากนี้ผมรู้ว่าx[0] = *(x+0);, x[1] = *(x+1)และอื่น ๆ .... ดังนั้นให้ประกาศข้างต้นเป็นเหตุผลว่าทำไมx[0] != x[0][0] != x[0][0][0]?
149 c++  c  arrays  pointers 

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