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

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

2
ฉันสามารถเรียก memcpy () และ memmove () โดยตั้งค่า "จำนวนไบต์" เป็นศูนย์ได้หรือไม่
ฉันจำเป็นต้องปฏิบัติต่อกรณีหรือไม่เมื่อฉันไม่มีสิ่งใดให้เคลื่อนย้าย / คัดลอกโดยมีmemmove()/ memcpy()เป็นกรณีขอบ int numberOfBytes = ... if( numberOfBytes != 0 ) { memmove( dest, source, numberOfBytes ); } หรือฉันควรเรียกใช้ฟังก์ชันโดยไม่ตรวจสอบ int numberOfBytes = ... memmove( dest, source, numberOfBytes ); การตรวจสอบข้อมูลโค้ดในอดีตจำเป็นหรือไม่
104 c++  c  pointers  memcpy  memmove 

4
ความแตกต่างระหว่าง std :: reference_wrapper และ simple pointer?
ทำไมถึงต้องมีstd::reference_wrapper? ควรใช้ที่ไหน? ต่างจากพอยน์เตอร์ธรรมดาอย่างไร? ประสิทธิภาพของมันเปรียบเทียบกับตัวชี้ธรรมดาอย่างไร?

4
อะไรคือจุดที่มีตัวชี้ใน Go?
ฉันรู้ว่าพอยน์เตอร์ใน Go อนุญาตให้มีการกลายพันธุ์ของอาร์กิวเมนต์ของฟังก์ชัน แต่จะไม่ง่ายไปกว่านี้หรือไม่หากพวกเขาใช้การอ้างอิงเพียงอย่างเดียว (โดยมี const ที่เหมาะสมหรือคุณสมบัติที่เปลี่ยนแปลงได้) ตอนนี้เรามีตัวชี้และสำหรับบางประเภทในตัวเช่นแผนที่และช่องสัญญาณโดยปริยายโดยการอ้างอิง ฉันพลาดอะไรไปหรือเป็นคำแนะนำใน Go เป็นเพียงภาวะแทรกซ้อนที่ไม่จำเป็น?
102 pointers  go 


3
ตัวชี้ไปยังฐานสามารถชี้ไปยังอาร์เรย์ของวัตถุที่ได้รับหรือไม่?
วันนี้ฉันไปสัมภาษณ์งานและได้รับคำถามที่น่าสนใจนี้ นอกจากหน่วยความจำรั่วและไม่มี virtual dtor เหตุใดรหัสนี้จึงผิดพลาด #include <iostream> //besides the obvious mem leak, why does this code crash? class Shape { public: virtual void draw() const = 0; }; class Circle : public Shape { public: virtual void draw() const { } int radius; }; class Rectangle : public Shape { …
99 c++  pointers 

17
พอยน์เตอร์ของฟังก์ชันคืออะไร?
ฉันมีปัญหาในการดูยูทิลิตี้ของตัวชี้ฟังก์ชัน ฉันเดาว่ามันอาจมีประโยชน์ในบางกรณี (มีอยู่จริง) แต่ฉันไม่สามารถนึกถึงกรณีที่ใช้ตัวชี้ฟังก์ชันได้ดีกว่าหรือหลีกเลี่ยงไม่ได้ คุณช่วยยกตัวอย่างการใช้ฟังก์ชันพอยน์เตอร์ (ใน C หรือ C ++) ให้ดีได้ไหม
96 c++  c  function  pointers  c++-faq 

5
วิธีเพิ่มที่อยู่ตัวชี้และค่าของตัวชี้
ให้เราถือว่า int *p; int a = 100; p = &a; โค้ดต่อไปนี้จะทำอะไรได้จริงและอย่างไร? p++; ++p; ++*p; ++(*p); ++*(p); *p++; (*p)++; *(p)++; *++p; *(++p); ฉันรู้ว่านี่เป็นเรื่องยุ่งในแง่ของการเข้ารหัส แต่ฉันอยากรู้ว่าจะเกิดอะไรขึ้นเมื่อเราเขียนโค้ดแบบนี้ หมายเหตุ: ให้คิดว่าที่อยู่ของa=5120300มันจะถูกเก็บไว้ในตัวชี้ที่มีอยู่คือp หลังจากการดำเนินการของแต่ละคำสั่ง3560200จะมีมูลค่าp & aเท่าใด
96 c  pointers 

13
ตำแหน่งของเครื่องหมายดอกจันในการประกาศตัวชี้
ฉันเพิ่งตัดสินใจว่าในที่สุดฉันก็ต้องเรียนรู้ C / C ++ และมีสิ่งหนึ่งที่ฉันไม่เข้าใจจริงๆเกี่ยวกับพอยน์เตอร์หรือคำจำกัดความของมัน ตัวอย่างเหล่านี้เป็นอย่างไร: int* test; int *test; int * test; int* test,test2; int *test,test2; int * test,test2; ตอนนี้ตามความเข้าใจของฉันสามกรณีแรกล้วนทำเหมือนกัน: การทดสอบไม่ใช่ int แต่เป็นตัวชี้ไปที่หนึ่ง ตัวอย่างชุดที่สองค่อนข้างยุ่งยากกว่าเล็กน้อย ในกรณีที่ 4 ทั้ง test และ test2 จะเป็นตัวชี้ไปที่ int ในขณะที่ในกรณีที่ 5 การทดสอบเท่านั้นที่เป็นตัวชี้ในขณะที่ test2 เป็น int "จริง" แล้วกรณีที่ 6 ล่ะ? เหมือนกับกรณีที่ 5 หรือไม่?
95 c++  c  pointers  declaration 

4
วิธีการประกาศ std :: unique_ptr และการใช้งานคืออะไร?
ฉันพยายามที่จะเข้าใจวิธีstd::unique_ptrการทำงานและการที่ผมพบนี้เอกสาร ผู้เขียนเริ่มจากตัวอย่างต่อไปนี้: #include <utility> //declarations of unique_ptr using std::unique_ptr; // default construction unique_ptr<int> up; //creates an empty object // initialize with an argument unique_ptr<int> uptr (new int(3)); double *pd= new double; unique_ptr<double> uptr2 (pd); // overloaded * and -> *uptr2 = 23.5; unique_ptr<std::string> ups (new std::string("hello")); int len=ups->size(); สิ่งที่ทำให้ฉันสับสนคือในบรรทัดนี้ unique_ptr<int> …
95 c++  pointers  std  unique-ptr 

1
“ ตัวชี้ไขมัน” คืออะไร?
ฉันได้อ่านคำว่า "fat pointer" ในหลาย ๆ บริบทแล้ว แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไรและเมื่อใดที่ใช้ใน Rust ตัวชี้ดูเหมือนจะใหญ่กว่าตัวชี้ปกติถึงสองเท่า แต่ฉันไม่เข้าใจว่าทำไม ดูเหมือนว่าจะมีบางอย่างเกี่ยวข้องกับวัตถุลักษณะ
95 pointers  rust 

6
ฟังก์ชั่น C # Store ในพจนานุกรม
ฉันจะสร้างพจนานุกรมที่เก็บฟังก์ชันได้อย่างไร? ขอบคุณ. ฉันมีฟังก์ชันมากกว่า 30 รายการซึ่งสามารถเรียกใช้งานได้จากผู้ใช้ ฉันต้องการเรียกใช้ฟังก์ชันนี้ด้วยวิธีนี้: private void functionName(arg1, arg2, arg3) { // code } dictionaryName.add("doSomething", functionName); private void interceptCommand(string command) { foreach ( var cmd in dictionaryName ) { if ( cmd.Key.Equals(command) ) { cmd.Value.Invoke(); } } } อย่างไรก็ตามลายเซ็นของฟังก์ชันจะไม่เหมือนกันเสมอไปดังนั้นจึงมีจำนวนอาร์กิวเมนต์ที่แตกต่างกัน

6
การลบตัวชี้ใน C ++
บริบท: ฉันพยายามห่อหัวตัวชี้เราเพิ่งเห็นพวกเขาเมื่อสองสามสัปดาห์ก่อนในโรงเรียนและขณะฝึกซ้อมวันนี้ฉันเจอเรื่องงี่เง่า? ปัญหาอาจตรงไปตรงมาสำหรับคุณ แต่ฉันไม่ค่อยมีประสบการณ์ในการเขียนโปรแกรมเลย ฉันเคยเห็นคำถามไม่กี่ข้อใน SO เกี่ยวกับการลบพอยน์เตอร์ แต่ดูเหมือนว่าทั้งหมดจะเกี่ยวข้องกับการลบคลาสไม่ใช่ตัวชี้ 'ธรรมดา' (หรือคำที่เหมาะสมอาจเป็นอะไรก็ได้) นี่คือรหัสที่ฉันพยายาม วิ่ง: #include <iostream>; using namespace std; int main() { int myVar, *myPointer; myVar = 8; myPointer = &myVar; cout << "delete-ing pointers " << endl; cout << "Memory address: " << myPointer << endl; // Seems I can't *just* …

5
วิธีที่ถูกต้องในการประกาศตัวแปรตัวชี้ใน C / C ++ [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน9 ปีที่ผ่านมา ฉันสังเกตเห็นบางคนใช้สัญกรณ์ต่อไปนี้ในการประกาศตัวแปรตัวชี้ (a) char* p; แทน (b) char *p; ฉันใช้ (b) อะไรคือเหตุผลที่อยู่เบื้องหลังสัญกรณ์ (ก)? สัญกรณ์ (b) มีความหมายสำหรับฉันมากขึ้นเนื่องจากตัวชี้อักขระไม่ใช่ประเภทเอง แทนที่จะเป็นประเภทอักขระและตัวแปรอาจเป็นตัวชี้ไปยังอักขระ char* c; ดูเหมือนว่ามีประเภท char * และตัวแปร c เป็นประเภทนั้น แต่ในความเป็นจริงประเภทคือถ่านและ * c (ตำแหน่งหน่วยความจำที่ชี้โดย c) เป็นประเภทนั้น (ถ่าน) หากคุณประกาศตัวแปรหลายตัวพร้อมกันความแตกต่างนี้จะชัดเจน char* c, *d; มันดูแปลก ๆ ทั้ง c และ d เป็นพอยน์เตอร์ชนิดเดียวกันที่ชี้ไปที่อักขระ …
92 c++  c  pointers  coding-style 

28
ตัวชี้การทดสอบความถูกต้อง (C / C ++)
มีวิธีใดในการตรวจสอบ (โดยทางโปรแกรมแน่นอน) ว่าตัวชี้ที่ระบุ "ถูกต้อง" การตรวจสอบค่า NULL นั้นง่าย แต่สิ่งที่เกี่ยวกับ 0x00001234? เมื่อพยายามหักล้างตัวชี้ชนิดนี้จะมีข้อยกเว้น / ข้อขัดข้องเกิดขึ้น แนะนำให้ใช้วิธีข้ามแพลตฟอร์ม แต่เฉพาะแพลตฟอร์ม (สำหรับ Windows และ Linux) ก็ใช้ได้เช่นกัน อัปเดตเพื่อการชี้แจง: ปัญหาไม่ได้อยู่ที่พอยน์เตอร์เก่า / เป็นอิสระ / ไม่ได้กำหนดค่าเริ่มต้น ฉันกำลังใช้ API ที่รับตัวชี้จากผู้โทรแทน (เช่นตัวชี้ไปยังสตริงตัวจัดการไฟล์ ฯลฯ ) ผู้โทรสามารถส่ง (ด้วยจุดประสงค์หรือโดยไม่ได้ตั้งใจ) ค่าที่ไม่ถูกต้องเป็นตัวชี้ ฉันจะป้องกันความผิดพลาดได้อย่างไร
92 c++  c  validation  pointers  null 

3
การอ้างอิงช่วงแทนค่า
ฉันเห็นช่วงดังกล่าวส่งคืนคีย์และ "สำเนา" ของค่า มีวิธีให้ช่วงนั้นคืนที่อยู่ของรายการหรือไม่? ตัวอย่าง package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } } http://play.golang.org/p/AFOGG9NGpx ที่นี่ "ฟิลด์" ไม่ได้รับการแก้ไขเนื่องจาก range ส่งสำเนาของฟิลด์ฉันต้องใช้ดัชนีหรือมีวิธีอื่นในการแก้ไขค่าหรือไม่? …
91 pointers  reference  go 

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