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

ตัวชี้เป็นชนิดข้อมูลที่ค่าอ้างอิงโดยตรง (หรือ "ชี้ไปที่") ค่าอื่นที่เก็บไว้ที่อื่นในหน่วยความจำคอมพิวเตอร์โดยใช้ที่อยู่

22
การอ้างอิง Null เป็นสิ่งที่เลวร้ายจริง ๆ หรือไม่?
ฉันได้ยินมาว่าการรวมการอ้างอิงโมฆะในภาษาการเขียนโปรแกรมเป็น "ความผิดพลาดพันล้านดอลลาร์" แต่ทำไม แน่นอนว่าพวกเขาสามารถทำให้ NullReferenceExceptions ได้ แต่อย่างนั้น องค์ประกอบของภาษาใด ๆ สามารถเป็นแหล่งของข้อผิดพลาดหากใช้ไม่ถูกต้อง และทางเลือกคืออะไร? ฉันคิดว่าแทนที่จะพูดสิ่งนี้: Customer c = Customer.GetByLastName("Goodman"); // returns null if not found if (c != null) { Console.WriteLine(c.FirstName + " " + c.LastName + " is awesome!"); } else { Console.WriteLine("There was no customer named Goodman. How lame!"); } คุณสามารถพูดสิ่งนี้: …

4
การอ้างอิง Java แตกต่างจากตัวชี้ C อย่างไร
C มีพอยน์เตอร์และ Java มีสิ่งที่เรียกว่าการอ้างอิง พวกเขามีบางสิ่งที่เหมือนกันในแง่ที่ว่าพวกเขาทั้งหมดชี้ไปที่บางสิ่งบางอย่าง ฉันรู้ว่าพอยน์เตอร์ใน C เก็บที่อยู่ที่ชี้ไป การอ้างอิงเก็บที่อยู่ด้วยหรือไม่ พวกมันแตกต่างกันอย่างไรยกเว้นตัวชี้นั้นจะยืดหยุ่นและผิดพลาดได้ง่ายกว่ากัน?
97 java  c  pointers  reference 

16
จิตใจที่อ่อนเยาว์จำเป็นต้องเรียนรู้แนวคิดตัวชี้?
เหตุใด C master Dennis Ritchie จึงแนะนำพอยน์เตอร์ใน C และทำไมภาษาโปรแกรมอื่น ๆ เช่น VB.NET หรือ Java หรือ C # จึงกำจัดภาษาเหล่านั้น ฉันพบบางจุดใน Google และฉันต้องการฟังความคิดเห็นของคุณด้วย ทำไมพวกเขาถึงกำจัดแนวคิดของตัวชี้ในภาษาสมัยใหม่? ผู้คนพูดว่า C เป็นภาษาพื้นฐานและพอยน์เตอร์เป็นแนวคิดที่ทำให้ C มีพลังและโดดเด่นและทำให้ C ยังคงแข่งขันกับภาษาที่ทันสมัยกว่าได้ แล้วทำไมพวกเขาถึงกำจัดพอยน์เตอร์ในภาษาที่ทันสมัยกว่า คุณคิดว่าความรู้เกี่ยวกับพอยน์เตอร์ยังคงมีความสำคัญต่อโปรแกรมเมอร์ใหม่หรือไม่? ทุกวันนี้ผู้คนกำลังใช้ VB.NET หรือ Java ซึ่งสนับสนุนคุณสมบัติขั้นสูงมากกว่า C (และไม่ใช้แนวคิดตัวชี้) และหลาย ๆ คนอย่างที่ฉันเห็นในตอนนี้ (เพื่อนของฉัน) เลือกภาษาเหล่านี้โดยไม่สนใจ C เนื่องจากสนับสนุนคุณสมบัติขั้นสูง ฉันบอกให้พวกเขาเริ่มต้นด้วย C. พวกเขาบอกว่าเป็นเรื่องเสียที่จะเรียนรู้แนวคิดของพอยน์เตอร์เมื่อคุณทำสิ่งขั้นสูงใน VB.NET หรือ Java …

30
คำอธิบายที่ดีสำหรับตัวชี้คืออะไร [ปิด]
ในการศึกษาของคุณเอง (ด้วยตัวคุณเองหรือในชั้นเรียน) คุณมีช่วงเวลาที่ "อาฮ่า" เมื่อคุณในที่สุดเข้าใจตัวชี้? คุณมีคำอธิบายที่ใช้สำหรับโปรแกรมเมอร์มือใหม่ที่ดูเหมือนมีประสิทธิภาพเป็นพิเศษหรือไม่? ตัวอย่างเช่นเมื่อผู้เริ่มต้นพบพอยน์เตอร์ใน C พวกเขาอาจเพิ่ม&s และ*s จนกว่ามันจะคอมไพล์ บางทีมันอาจจะเป็นรูปภาพหรือเป็นตัวอย่างที่สร้างแรงบันดาลใจได้ดีซึ่งทำให้ตัวชี้ "คลิก" สำหรับคุณหรือนักเรียนของคุณ มันคืออะไรและคุณลองทำอะไรก่อนหน้านี้ดูเหมือนจะไม่ทำงาน มีข้อกำหนดเบื้องต้นใด ๆ ของหัวข้อ (เช่นโครงสร้างหรืออาร์เรย์) หรือไม่ พูดอีกอย่างหนึ่งว่าอะไรคือสิ่งที่จำเป็นในการเข้าใจความหมายของ&s และ*เมื่อคุณสามารถใช้มันด้วยความมั่นใจ การเรียนรู้ไวยากรณ์และคำศัพท์หรือกรณีการใช้งานยังไม่เพียงพอในบางจุดความคิดจำเป็นต้องถูกทำให้เป็นภายใน Update:ฉันชอบคำตอบจริงๆ โปรดให้พวกเขามา มีมุมมองที่ดีมากมายที่นี่ แต่ฉันคิดว่าหลายคนมีคำอธิบาย / คำขวัญที่ดีสำหรับตัวเราเองหลังจากที่เราใช้แนวคิดนี้ ฉันกำลังมองหารายละเอียดบริบทและสถานการณ์เมื่อเริ่มต้นกับคุณ ตัวอย่างเช่น: ฉันแค่เข้าใจพอยน์เตอร์ syntactically ใน C. ฉันได้ยินเพื่อนของฉันสองคนอธิบายพอยน์เตอร์ให้เพื่อนอีกคนหนึ่งซึ่งถามว่าทำไม a ถึงstructถูกส่งผ่านด้วยพอยน์เตอร์ เพื่อนคนแรกพูดคุยเกี่ยวกับวิธีการที่จะต้องมีการอ้างอิงและแก้ไข แต่มันเป็นเพียงความเห็นสั้น ๆ จากเพื่อนคนอื่น ๆ ที่มันตีฉัน: "มันมีประสิทธิภาพมากขึ้นด้วย" การส่งผ่าน 4 ไบต์แทนที่จะเป็น 16 ไบต์เป็นการเปลี่ยนแนวคิดขั้นสุดท้ายที่ฉันต้องการ

17
ปัญหาการเขียนโปรแกรมใดที่แก้ไขได้ดีที่สุดโดยใช้พอยน์เตอร์? [ปิด]
โดยทั่วไปฉันเข้าใจวิธีใช้พอยน์เตอร์ แต่ไม่ใช่วิธีที่ดีที่สุดในการใช้เพื่อทำให้โปรแกรมดีขึ้น โครงการหรือปัญหาที่ดีในการแก้ไขที่เกี่ยวข้องกับการใช้พอยน์เตอร์เพื่อให้ฉันสามารถเข้าใจได้ดีขึ้นคืออะไร

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

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

1
raw, weak_ptr, unique_ptr, shared_ptr ฯลฯ ... วิธีการเลือกอย่างชาญฉลาด?
มีพอยน์เตอร์จำนวนมากใน C ++ แต่จะซื่อสัตย์ใน 5 ปีหรือมากกว่านั้นในการเขียนโปรแกรม C ++ (โดยเฉพาะกับ Qt Framework) ฉันใช้พอยน์เตอร์พอยต์แบบเก่าเท่านั้น: SomeKindOfObject *someKindOfObject = new SomeKindOfObject(); ฉันรู้ว่ามีคำแนะนำ "ฉลาด" อื่น ๆ อีกมากมาย: // shared pointer: shared_ptr<SomeKindofObject> Object; // unique pointer: unique_ptr<SomeKindofObject> Object; // weak pointer: weak_ptr<SomeKindofObject> Object; แต่ฉันไม่มีความคิดเพียงเล็กน้อยเกี่ยวกับสิ่งที่พวกเขาทำและสิ่งที่พวกเขาสามารถเสนอให้ฉันได้เปรียบเทียบตัวชี้แบบดิบ ตัวอย่างเช่นฉันมีส่วนหัวของชั้นนี้: #ifndef LIBRARY #define LIBRARY class LIBRARY { public: // Permanent list …

19
แอปพลิเคชันในโลกแห่งความเป็นจริงจะต้องใช้พื้นที่ที่อยู่แบบ 128 บิตหรือไม่
นี่เป็นบิต "หนึ่งเมกะไบต์ควรเพียงพอสำหรับทุกคน" แต่ ... พื้นที่ที่อยู่แบบ 64 บิตช่วยให้มีพื้นที่มากถึง 4.3ish billion เท่าของพื้นที่ที่อยู่แบบ 32 บิต นั่นคือ 17,179,869,184 GiB เห็นได้ชัดว่าการเปลี่ยนจาก 8 บิตเป็น 16 บิตนั้นค่อนข้างเร็ว (ฉันกำลังดูสิ่งต่าง ๆ ในช่วงวัยรุ่นในช่วงยุค 80 โดยไม่สนใจเมนเฟรมและมิมส์เหล่านั้นทั้งหมดเพราะพวกเขาไม่สามารถวิ่งผ่านพอร์ตของ Elite) การเปลี่ยนจาก 16 บิตเป็น 32 บิตใช้เวลานานขึ้นเล็กน้อยและจริง ๆ แล้ว 32 บิตกินเวลานาน ตอนนี้เรามี 64 บิตมันจะโง่ที่จะพูดว่า "17,179,869,184 GiB น่าจะเพียงพอสำหรับทุกคน" นี่คือคำถามโปรแกรมเมอร์เพราะฉันมีมุมมองการเขียนโปรแกรมในใจ แม้ว่าคอมพิวเตอร์ในแต่ละวันจะมีหน่วยความจำในการทำงานที่ดูเหมือนไม่มีที่สิ้นสุด แต่นั่นไม่ได้หมายความว่าแอปพลิเคชันจะต้องดูพื้นที่ที่อยู่แบบไม่ จำกัด ที่ดูเหมือนไม่มีที่สิ้นสุด โดยพื้นฐานแล้วเราสามารถเขียนโปรแกรมให้ถอนหายใจด้วยความโล่งอกแล้วพูดว่า "เอาล่ะไม่ว่าจะเป็นจำนวนเต็มหรือลอยอย่างน้อยที่สุดฉันก็ไม่ต้องกังวลเกี่ยวกับพอยน์เตอร์ที่เพิ่มขึ้นอีกแล้ว"

10
ข้อมูล "ประเภท" ของตัวชี้ที่เก็บไว้ในภาษา C คืออะไร
ฉันรู้ว่าพอยน์เตอร์เก็บที่อยู่ ฉันรู้ว่าประเภทของพอยน์เตอร์เป็นที่รู้จักกันโดยทั่วไปตาม "ประเภท" ของข้อมูลที่ชี้ไป แต่พอยน์เตอร์ยังคงเป็นตัวแปรและที่อยู่ที่เก็บไว้จะต้องมีข้อมูล "ประเภท" ตามข้อมูลของฉันที่อยู่ในรูปแบบเลขฐานสิบหก แต่ฉันก็ยังไม่รู้ว่าข้อมูล "ประเภท" คือเลขฐานสิบหกนี้ (โปรดทราบว่าฉันรู้ว่าเลขฐานสิบหกคืออะไร แต่เมื่อคุณพูด10CBA20เช่นสตริงของอักขระนี้คือจำนวนเต็มอะไรเมื่อฉันต้องการเข้าถึงที่อยู่และจัดการมัน .. ตัวเองฉันต้องรู้ประเภทของมัน คือเหตุผลที่ฉันถาม)
30 c  pointers 

12
int * i; หรือ int * i; หรือ int * i; [ปิด]
อะไรคือวิธีที่คุณชื่นชอบในการประกาศตัวชี้? int* i; หรือ int *i; หรือ int * i; หรือ int*i; กรุณาอธิบายว่าทำไม ดูเพิ่มเติมได้ที่: http://www.stroustrup.com/bs_faq2.html#whitespace

10
การใช้ตัวแปรพอยน์เตอร์เป็นค่าใช้จ่ายในหน่วยความจำใช่หรือไม่
ในภาษาอย่าง C และ C ++ ในขณะที่ใช้พอยน์เตอร์กับตัวแปรเราต้องการที่ตั้งหน่วยความจำอีกหนึ่งแห่งเพื่อเก็บที่อยู่นั้น ดังนั้นนี่ไม่ใช่ค่าใช้จ่ายหน่วยความจำ? สิ่งนี้ได้รับการชดเชยอย่างไร? พอยน์เตอร์ใช้ในเวลาที่แอปพลิเคชันหน่วยความจำเหลือน้อยหรือไม่?
29 c++  c  pointers 

3
เหตุใด int จึงใช้เวลา 12 ไบต์ในเครื่องบางเครื่อง
ฉันสังเกตเห็นสิ่งที่แปลกหลังจากรวบรวมรหัสนี้ในเครื่องของฉัน: #include <stdio.h> int main() { printf("Hello, World!\n"); int a,b,c,d; int e,f,g; long int h; printf("The addresses are:\n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x", &a,&b,&c,&d,&e,&f,&g,&h); return 0; } ผลที่ได้คือ โปรดสังเกตว่าระหว่างทุก int แอดเดรสจะมีความแตกต่าง 4 ไบต์ อย่างไรก็ตามระหว่าง int สุดท้ายและ int ยาวมีความแตกต่าง 12 ไบต์: …
26 c  memory  pointers 

4
เหตุใด C ++ และ Java ทั้งสองจึงใช้แนวคิดของ“ การอ้างอิง” แต่ไม่เข้าใจ
ใน C ++ อาร์กิวเมนต์การอ้างอิงไปยังฟังก์ชันอนุญาตให้ฟังก์ชันทำการอ้างอิงถึงสิ่งอื่น: int replacement = 23; void changeNumberReference(int& reference) { reference = replacement; } int main() { int i = 1; std::cout << "i=" << i << "\n"; // i = 1; changeNumberReference(i); std::cout << "i=" << i << "\n"; // i = 23; } อะนาล็อกอาร์กิวเมนต์อ้างอิงคงที่ไปยังฟังก์ชันจะแสดงข้อผิดพลาดเวลารวบรวมถ้าเราพยายามเปลี่ยนการอ้างอิง: void changeNumberReference(const …
26 java  c++  pointers  reference 

3
ทำไมถึงต้องเพิ่มพอยน์เตอร์?
ฉันเพิ่งเริ่มเรียนรู้ C ++ และเป็นคนส่วนใหญ่ (ตามสิ่งที่ฉันได้อ่าน) ฉันกำลังดิ้นรนกับพอยน์เตอร์ ไม่ใช่ในความหมายดั้งเดิมฉันเข้าใจว่าพวกเขาคืออะไรและทำไมจึงใช้และวิธีที่มีประโยชน์อย่างไร แต่ฉันไม่เข้าใจว่าตัวชี้การเพิ่มขึ้นจะมีประโยชน์ใคร ๆ สามารถให้คำอธิบายว่าการเพิ่มพอยน์เตอร์เป็นอย่างไร แนวคิดที่มีประโยชน์และสำนวน C ++? คำถามนี้เกิดขึ้นหลังจากที่ฉันเริ่มอ่านหนังสือA Tour of C ++โดย Bjarne Stroustrup ฉันแนะนำหนังสือเล่มนี้เพราะฉันค่อนข้างคุ้นเคยกับ Java และคนที่ Reddit บอกว่ามันจะเป็นหนังสือที่ 'ดีมาก' .
25 c++  c  pointers 

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