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

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

17
พอยน์เตอร์พอยน์คืออะไร?
ฉันไม่ได้พูดถึงพอยน์เตอร์ให้เป็นค่าคงที่ แต่เป็นพอยต์พอยต์ของตัวเอง ฉันกำลังเรียนรู้ C และ C ++ เกินกว่าสิ่งพื้นฐานมากและจนถึงวันนี้ฉันก็ตระหนักว่าตัวชี้ถูกส่งผ่านไปยังฟังก์ชั่นที่มีคุณค่า ซึ่งหมายความว่าภายในฟังก์ชั่นฉันสามารถทำให้ตัวชี้ที่คัดลอกไปยังค่าอื่น ๆ โดยไม่ส่งผลกระทบต่อตัวชี้ดั้งเดิมจากผู้โทร ดังนั้นประเด็นของการมีส่วนหัวของฟังก์ชั่นที่บอกว่า: void foo(int* const ptr); ภายในฟังก์ชั่นดังกล่าวคุณไม่สามารถกำหนดจุด ptr เป็นอย่างอื่นได้เนื่องจากเป็นค่าคงที่และคุณไม่ต้องการให้แก้ไข แต่เป็นฟังก์ชันดังนี้: void foo(int* ptr); ทำงานได้ดีเช่นกัน! เนื่องจากตัวชี้ถูกคัดลอกแล้วและตัวชี้ในผู้โทรจะไม่ได้รับผลกระทบแม้ว่าคุณจะแก้ไขการคัดลอก ดังนั้นข้อดีของ const คืออะไร
149 c++  c  pointers  const 

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


16
ตัวชี้ไปยังตัวชี้ชี้แจง
ฉันกำลังทำตามบทช่วยสอนนี้เกี่ยวกับตัวชี้ไปยังตัวชี้ทำงานอย่างไร ให้ฉันอ้างอิงข้อความที่เกี่ยวข้อง: int i = 5, j = 6, k = 7; int *ip1 = &i, *ip2 = &j; ตอนนี้เราสามารถตั้งค่า int **ipp = &ip1; และippชี้ไปที่จุดที่จะต้องip1 คือและคือหรือ 5 เราสามารถอธิบายสถานการณ์ด้วยสัญกรณ์กล่องและลูกศรที่เราคุ้นเคยเช่นนี้i*ippip1**ippi ถ้าอย่างนั้นเราพูด *ipp = ip2; เราได้เปลี่ยนพอยน์เตอร์ที่ชี้โดยipp(นั่นคือip1) เพื่อให้มีสำเนาip2ดังนั้นip1ตอนนี้( ) จะชี้ไปที่j: คำถามของฉันคือ: ทำไมในภาพที่สองippยังคงชี้ไปip1แต่ไม่ip2?
142 c  pointers 

23
จะอธิบายพอยน์เตอร์ C (การประกาศเทียบกับโอเปอเรเตอร์ unary) ให้กับผู้เริ่มต้นได้อย่างไร
ฉันมีความยินดีที่จะอธิบายพอยน์เตอร์ให้กับการเขียนโปรแกรม C และเริ่มสะดุดเมื่อมีปัญหาต่อไปนี้ อาจไม่เหมือนปัญหาเลยถ้าคุณรู้วิธีใช้ตัวชี้ไปแล้ว แต่ลองดูตัวอย่างต่อไปนี้ด้วยใจที่ชัดเจน: int foo = 1; int *bar = &foo; printf("%p\n", (void *)&foo); printf("%i\n", *bar); สำหรับผู้เริ่มต้นการส่งออกอาจจะน่าแปลกใจ ในบรรทัดที่ 2 เขา / เธอเพิ่งประกาศ * bar ให้เป็น & foo แต่ในบรรทัดที่ 4 ปรากฎว่า * bar นั้นเป็น foo แทนที่จะเป็น & foo! ความสับสนคุณอาจพูดว่าเกิดจากความกำกวมของสัญลักษณ์ *: ในบรรทัดที่ 2 มันถูกใช้เพื่อประกาศพอยน์เตอร์ ในบรรทัดที่ 4 จะใช้เป็นตัวดำเนินการ unary ซึ่งดึงค่าจุดตัวชี้ที่ สองสิ่งที่แตกต่างใช่มั้ย …
141 c  pointers 

16
ลบ [] รู้ได้อย่างไรว่าเป็นอาร์เรย์
เอาล่ะฉันคิดว่าเราทุกคนยอมรับว่าสิ่งที่เกิดขึ้นกับรหัสต่อไปนี้ไม่ได้กำหนดขึ้นอยู่กับสิ่งที่ส่งผ่าน void deleteForMe(int* pointer) { delete[] pointer; } ตัวชี้อาจเป็นสิ่งที่แตกต่างกันได้ดังนั้นการดำเนินการอย่างไม่มีเงื่อนไขdelete[]จึงไม่ได้กำหนดไว้ อย่างไรก็ตามสมมติว่าเรากำลังส่งตัวชี้อาร์เรย์ int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } คำถามของฉันคือในกรณีนี้ที่ตัวชี้เป็นอาร์เรย์ใครเป็นคนรู้เรื่องนี้ ฉันหมายถึงจากมุมมองของภาษา / คอมไพเลอร์ไม่มีความคิดว่าarrเป็นตัวชี้อาร์เรย์หรือไม่เมื่อเทียบกับตัวชี้ไปยัง int เดียว Heck ไม่รู้ด้วยซ้ำว่าarrถูกสร้างขึ้นแบบไดนามิกหรือไม่ แต่ถ้าฉันทำสิ่งต่อไปนี้แทน int main() { int* num = new int(1); deleteForMe(num); return 0; } ระบบปฏิบัติการมีความฉลาดพอที่จะลบเพียง int เดียวและไม่ใช้ 'ความสนุกสนานในการฆ่า' บางประเภทโดยการลบหน่วยความจำที่เหลือเกินกว่าจุดนั้น (ตรงกันข้ามกับสตริงที่strlenไม่มีการตัด\0ทอนและจะดำเนินต่อไปจนกว่าจะถึง ฮิต …

5
ไม่เข้าใจวิธีคำนวณกำลังสองของตัวเลขนี้
ฉันพบฟังก์ชันที่คำนวณกำลังสองของตัวเลข: int p(int n) { int a[n]; //works on C99 and above return (&a)[n] - a; } ก็จะส่งกลับค่า n 2 คำถามคือมันทำได้อย่างไร? หลังจากการทดสอบเล็ก ๆ น้อย ๆ ผมพบว่าระหว่าง(&a)[k]และ(&a)[k+1]เป็น/sizeof(a) sizeof(int)ทำไมถึงเป็นเช่นนั้น?

9
เหตุใดการใช้ 'ใหม่' จึงทำให้หน่วยความจำรั่ว?
ฉันเรียนรู้ C # ก่อนและตอนนี้ฉันเริ่มต้นด้วย C ++ ตามที่ฉันเข้าใจโอเปอเรเตอร์newใน C ++ ไม่เหมือนกับตัวดำเนินการใน C # คุณสามารถอธิบายสาเหตุของการรั่วไหลของหน่วยความจำในโค้ดตัวอย่างนี้ได้หรือไม่? class A { ... }; struct B { ... }; A *object1 = new A(); B object2 = *(new B());

6
Visual Studio ทำอะไรกับตัวชี้ที่ถูกลบและทำไม?
หนังสือ C ++ ที่ฉันอ่านระบุว่าเมื่อตัวชี้ถูกลบโดยใช้deleteโอเปอเรเตอร์หน่วยความจำในตำแหน่งที่ชี้ไปนั้น "ว่าง" และสามารถเขียนทับได้ NULLนอกจากนี้ยังระบุว่าตัวชี้จะยังคงชี้ไปที่สถานที่เดียวกันจนกว่าจะมีพระราชเสาวนีย์หรือตั้งค่า ใน Visual Studio 2012 อย่างไรก็ตาม ดูเหมือนจะไม่เป็นเช่นนั้น! ตัวอย่าง: #include <iostream> using namespace std; int main() { int* ptr = new int; cout << "ptr = " << ptr << endl; delete ptr; cout << "ptr = " << ptr << endl; system("pause"); return 0; …

14
เหตุใดตัวชี้ฟังก์ชันและตัวชี้ข้อมูลจึงไม่เข้ากันใน C / C ++
ฉันได้อ่านพบว่าการแปลงตัวชี้ฟังก์ชันเป็นตัวชี้ข้อมูลและในทางกลับกันใช้งานได้กับแพลตฟอร์มส่วนใหญ่ แต่ไม่รับประกันว่าจะใช้งานได้ เหตุใดจึงเป็นเช่นนี้ ทั้งสองไม่ควรเป็นเพียงที่อยู่ในหน่วยความจำหลักดังนั้นจึงเข้ากันได้?

10
การส่งต่อการอ้างอิงไปยังพอยน์เตอร์ใน C ++
เท่าที่ฉันสามารถบอกได้ไม่มีเหตุผลใดที่ฉันไม่ควรได้รับอนุญาตให้ส่งการอ้างอิงไปยังตัวชี้ใน C ++ อย่างไรก็ตามความพยายามของฉันล้มเหลวและฉันไม่รู้ว่าทำไม นี่คือสิ่งที่ฉันทำ: void myfunc(string*& val) { // Do stuff to the string pointer } // sometime later { // ... string s; myfunc(&s); // ... } และฉันได้รับข้อผิดพลาดนี้: ไม่สามารถแปลงพารามิเตอร์ 1 จาก 'std :: string *' เป็น 'std :: string * &'
130 c++  pointers  reference 

10
นิพจน์ตัวชี้: * ptr ++, * ++ ptr และ ++ * ptr
เมื่อเร็ว ๆ นี้ฉันพบปัญหานี้ซึ่งฉันไม่สามารถเข้าใจได้ด้วยตัวเอง ทำอะไรที่สามเหล่านี้แสดงออกจริงๆหมายถึง? *ptr++ *++ptr ++*ptr ฉันได้ลอง Ritchie แล้ว แต่น่าเสียดายที่ไม่สามารถทำตามสิ่งที่เขาบอกเกี่ยวกับปฏิบัติการทั้ง 3 นี้ได้ ฉันรู้ว่าพวกเขาทั้งหมดทำเพื่อเพิ่มตัวชี้ / ค่าที่ชี้ไป ฉันยังเดาได้ว่าอาจมีหลายสิ่งหลายอย่างเกี่ยวกับลำดับความสำคัญและลำดับของการประเมินผล เช่นเดียวกับการเพิ่มตัวชี้หนึ่งครั้งก่อนจากนั้นดึงเนื้อหาของตัวชี้นั้นตัวหนึ่งก็ดึงเนื้อหาจากนั้นจึงเพิ่มตัวชี้เป็นต้นอย่างที่คุณเห็นฉันไม่มีความเข้าใจที่ชัดเจนเกี่ยวกับการทำงานจริงของตัวชี้ซึ่งฉันต้องการ ชัดเจนโดยเร็วที่สุด แต่ฉันหลงทางอย่างแท้จริงเมื่อมีโอกาสสมัครเข้าโปรแกรม ตัวอย่างเช่น: int main() { const char *p = "Hello"; while(*p++) printf("%c",*p); return 0; } ให้ผลลัพธ์นี้แก่ฉัน: ello แต่ความคาดหวังของฉันคือมันจะพิมพ์ออกHelloมา คำขอสุดท้าย - โปรดยกตัวอย่างการทำงานของแต่ละนิพจน์ในข้อมูลโค้ดที่กำหนด ส่วนใหญ่แล้วมีเพียงย่อหน้าของทฤษฎีเท่านั้นที่ลอยอยู่เหนือหัวของฉัน
128 c++  c  pointers  increment 


9
ตัวชี้ใน Python?
ฉันรู้ว่า Python ไม่มีพอยน์เตอร์ แต่มีวิธีให้ผลตอบแทนนี้2แทนได้ไหม >>> a = 1 >>> b = a # modify this line somehow so that b "points to" a >>> a = 2 >>> b 1 ? นี่คือตัวอย่าง: ฉันต้องการform.data['field']และform.field.valueมีค่าเท่ากันเสมอ มันไม่จำเป็นอย่างสมบูรณ์ แต่ฉันคิดว่ามันคงจะดี ตัวอย่างเช่นใน PHP ฉันสามารถทำได้: <?php class Form { public $data = []; public $fields; function __construct($fields) …
124 python  pointers 

5
ความแตกต่างระหว่าง * ptr + = 1 และ * ptr ++ ใน C
ฉันเพิ่งเริ่มศึกษา C และเมื่อทำตัวอย่างหนึ่งเกี่ยวกับการส่งตัวชี้ไปยังตัวชี้เป็นพารามิเตอร์ของฟังก์ชันฉันพบปัญหา นี่คือโค้ดตัวอย่างของฉัน: #include <stdio.h> #include <string.h> #include <stdlib.h> int* allocateIntArray(int* ptr, int size){ if (ptr != NULL){ for (int i = 0; i < size; i++){ ptr[i] = i; } } return ptr; } void increasePointer(int** ptr){ if (ptr != NULL){ *ptr += 1; /* <----------------------------- This is …

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